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

4

我正在尝试将现有的代码转换为constexpr,但是出现了以下错误信息:

错误:在“constexpr”函数中声明了“my_string”的“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.";
  }
};

字符串在其他地方当然会被使用,我想确保它们永远不会重复(因此是静态的),并且我希望通过使用BOOST_CONSTEXPR_OR_CONST来维护对C++03兼容性的支持,因为在C++03中并没有constexpr。

你需要使用数组而不是C字符串指针吗?const char* my_string; 不够吗? - Jarod42
1
顺便说一下,std::cout << 不是 constexpr - Jarod42
将变量放置在函数外的匿名命名空间中,并在其上使用BOOST_CONSTEXPR_OR_CONST cv。 - kfsone
1个回答

6

目前,在constexpr函数中无法使用静态变量。如果该变量是通过编译时表达式初始化的,则有一个提案放宽此要求。

由于您正在对字符串文字赋值,我建议只需删除“static”,并假定编译器会以最优方式处理它(在实践中应该是这样)。另一种选择是将该字符串作为私有类成员或命名空间范围内的static constexpr设置。


3
这证实了我的猜想,这是一个不必要的烦人限制。对于单个用途,建议只是微不足道的更改,但这适用于数十个函数和分布,所以任何更改都会很麻烦。有其他的障碍使它成为constexpr,因此我会等待c++latest的放宽限制。 - Paul A. Bristow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接