C++ Weekly - Episode 122 脱水版: constexpr With optional and variant
C++ 17 引入了 optional,但是对于赋值操作 std::optional<T>::operator=,并不是 constexpr. 因此,我们无法在一个constexpr 函数中对一个 optional 进行修改。例如:
#include <iostream>
#include <optional>
constexpr std::optional<int> get_value() {
std::optional<int> val = 1;
val = 3; // 非 constexpr 表达式
return val;
}
int main()
{
constexpr auto val = get_value();
std::cout << *val;
}
get_value 是一个 constexpr 函数,因此在函数内部,我们无法调用一个非 constexpr 的赋值表达式。但是,该代码片段在 gcc 在 C++17 版本能编译通过。这可能是编译器的一个 bug。
对于 variant 同理。
NOTE:
- C++20 已经启用了
constexpr, 上述代码片段可以通过编译合乎标准。 - 可以使用 clang 6.0 尝试编译,上述代码无法通过编译
error: constexpr function never produces a constant expression [-Winvalid-constexpr]