constexpr函数返回字符串文字

时间:2014-03-21 02:20:15

标签: c++ string c++11 constexpr c-strings

返回整数文字副本的函数

int number()
{ return 1; }
使用关键字constexpr可以轻松地将

转换为普通的编译时表达式。

constexpr int number()
{ return 1; }

然而,当涉及到字符串文字时,我感到困惑。通常的方法是返回指向字符串文字的const char指针

const char* hello()
{ return "hello world"; }

但我认为仅仅将“const”更改为constexpr并不是我想要的(作为奖励,它还会产生编译器警告不赞成从字符串常量转换为'char *'使用gcc 4.7.1)

constexpr char* hello()
{ return "hello world"; }

有没有办法以这样的方式实现hello(),以便在下面的示例中使用常量表达式替换调用?

int main()
{
    std::cout << hello() << "\n";
    return 0;
}

2 个答案:

答案 0 :(得分:9)

constconstexprnot interchangeable,在您的情况下,您不想删除const,但是您想添加constexpr,如下所示:< / p>

constexpr const char* hello()
{
  return "hello world";
}

删除const时收到的警告,是因为字符串文字array of n const char,因此指向字符串文字的指针应该是一个* const char **但是在 C 字符串文字是一个char数组,即使它是未定义的行为来尝试修改它们也是为了向后保留兼容性但折旧,所以应该避免。

答案 1 :(得分:2)

强制constexpr评估:

constexpr const char * hi = hello();
std::cout << hi << std::endl;