Date: Tue, 4 Mar 2025 11:20:40 +0100
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.
>
>
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 10:20:53