在 constexpr 函数中声明为静态的文字字符串

Pau*_*tow 3 c++ string static literals constexpr

我正在尝试使 constexpr 一些现有代码,但收到消息

错误:“my_string”在“constexpr”函数中声明为“static”

简化了很多,代码如下:

template <typename T>
constexpr
int foo(const int x)
{
  static // error: 'my_string' declared 'static' in 'constexpr' function
  constexpr char my_string[] = "my foo error message!";
  if (x == 0)
  {
    std::cout << my_string << std::endl;
  }
  return  x;
}

class boo
{
public:
  constexpr boo()
  {
   static // error: 'constructor_string' declared 'static' in 'constexpr' function
   constexpr char constructor_string[] = "my constructor error message.";
  }
};
Run Code Online (Sandbox Code Playgroud)

字符串当然在其他地方使用,我想确保它们永远不会重复(如此静态)(并且我想保持使用静态以与 C++03 兼容,其中 constexpr 不可用使用BOOST_CONSTEXPR_OR_CONST)。

Dav*_*vid 5

目前在 constexpr 函数中不能有静态变量。如果变量是用编译时表达式初始化的,则有一个建议可以放宽该要求。

由于您要分配给字符串文字,因此我建议您只删除“静态”并假设编译器使其尽可能最佳(在实践中应该这样做)。另一种选择是将字符串 astatic constexpr作为私有类成员,或在命名空间范围内。

  • 这证实了我的怀疑,即这是一个不必要的烦人的限制。对于单次使用,建议是微不足道的更改,但这适用于数十个功能和发行版,因此任何更改都是混乱的。使其成为 constexpr 还存在其他障碍,因此我将等待 c++latest 中的放松。 (3认同)