Date: Tue, 4 Mar 2025 15:03:12 +0100
Generally I wanted [[pure]] to be a combination of both [[unsequenced]] and
[[reproducible]].
On Tue, 4 Mar 2025, 11:20 Tymi, <tymi.cpp_at_[hidden]> wrote:
> I somehow didn't see your reply until now.
>
> Yes, you may call other pure functions from a pure function. I think it
> also might be okay to call constexpr/consteval functions as well.
>
>
> No, you may not call a function that could have side effects from a pure
> function. That could be ill-formed, no diagnostics required.
>
> Function parameters could be changed if it was passed by value, and of
> course, you don't call any unpure functions.
> Example:
> [[pure]] std::string AddX(std::string str)
> {
> str.append("X");
> return str;
> }
>
> Is fine.
>
> Yes, the compiler might assume that the function produces the same effect
> for the same arguments. It is up to the implementation, but generally you
> could make a lookup table or just call the function one and store its
> result.
>
> Tymi.
>
> On Tue, 4 Mar 2025, 08:07 Tymi, <tymi.cpp_at_[hidden]> wrote:
>
>> Some functions have no side effects, and while they can be often
>> optimised, the compiler is not aware of that.
>> Consider this example:
>> ```cpp
>> template <std::arithmetic T> constexpr T(const T a, const T b) { return a
>> + b; }
>> ```
>> That function could be declared as pure, or in other words, produces no
>> side effects.
>>
>> I think this is a great way to optimise frequent calls, such as a pure
>> function's result can be cached for the same arguments provided.
>>
>> Diagnostics: if a pure function has side effects, the compiler shall
>> issue a warning and calling that function is undefined.
>>
>> pure member function shall be declared as const, otherwise, the program
>> is ill-formed.
>>
>>
[[reproducible]].
On Tue, 4 Mar 2025, 11:20 Tymi, <tymi.cpp_at_[hidden]> wrote:
> I somehow didn't see your reply until now.
>
> Yes, you may call other pure functions from a pure function. I think it
> also might be okay to call constexpr/consteval functions as well.
>
>
> No, you may not call a function that could have side effects from a pure
> function. That could be ill-formed, no diagnostics required.
>
> Function parameters could be changed if it was passed by value, and of
> course, you don't call any unpure functions.
> Example:
> [[pure]] std::string AddX(std::string str)
> {
> str.append("X");
> return str;
> }
>
> Is fine.
>
> Yes, the compiler might assume that the function produces the same effect
> for the same arguments. It is up to the implementation, but generally you
> could make a lookup table or just call the function one and store its
> result.
>
> Tymi.
>
> On Tue, 4 Mar 2025, 08:07 Tymi, <tymi.cpp_at_[hidden]> wrote:
>
>> Some functions have no side effects, and while they can be often
>> optimised, the compiler is not aware of that.
>> Consider this example:
>> ```cpp
>> template <std::arithmetic T> constexpr T(const T a, const T b) { return a
>> + b; }
>> ```
>> That function could be declared as pure, or in other words, produces no
>> side effects.
>>
>> I think this is a great way to optimise frequent calls, such as a pure
>> function's result can be cached for the same arguments provided.
>>
>> Diagnostics: if a pure function has side effects, the compiler shall
>> issue a warning and calling that function is undefined.
>>
>> pure member function shall be declared as const, otherwise, the program
>> is ill-formed.
>>
>>
Received on 2025-03-04 14:03:24