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

literal string declared static in constexpr function

本文关键字:文字 字符串 静态 函数 声明 constexpr      更新时间:2023-10-16

我试图使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.";
  }
};

字符串当然在其他地方使用,我希望确保它们永远不会重复(因此是静态的)(为了与C++03兼容,我希望保持静态的使用,在C++03中,使用BOOST_constexpr_OR_CONST无法获得constexpr)。

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

由于您正在为字符串文字赋值,我建议您删除"static",并假设编译器以任何一种方式使其尽可能优化(在实践中,它应该这样做)。另一种选择是使字符串成为static constexpr作为私有类成员,或者在命名空间范围内。