C++ Weekly - Episode 122 脱水版: `constexpr` With `optional` and `variant`

211 阅读1分钟

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]