2017-07-28 19 views
8

考虑下面的代码:在constexpr函数中返回一个C字符串:为什么没有编译器的警告?

constexpr auto f() 
{ 
    auto str = "Hello World!"; 
    return str; 
} 

int main(int argc, char* argv[]) 
{ 
    static constexpr auto str = f(); 
    std::cout << str << std::endl; 
    return 0; 
} 

这是正常的,我的编译器不会显示任何警告?它是否定义了行为?我有保证程序将显示"Hello World!"?我预计"Hello World!"不会超出该功能的范围...

回答

13

在C++ string literalsstatic storage duration和只要程序运行生活。所以,从f返回的字符串文字的指针总是有效的。不涉及分配或取消分配。

请注意,字符串文字的类型为const char[N],在您的情况下,由于auto类型的扣除而衰减到const char *。如果您的目的是使用std::string,您可以直接构建它

auto str = std::string("Hello World!"); 

或使用operator""s

using std::string_literals; 
auto str = "Hello World!"s; 

然而,由于std::string是不是文字类型,这个值cannot be constexpr了。

+1

“字符串文字的类型为const char *'”它们不是。 –

+0

@ T.C。具体长度的const char数组? – Orient

+0

@ T.C。的确,谢谢。 – lisyarus

5

这就是的第二个效果的自动。你认为它是什么,并不总是编译器决定的。这可能导致错误的程序员期望 - 规则在这里编译器总是赢得

这里的事实是str是一个const char *到一个(静态存储持续时间)字符串litteral。它可以在构建时完全确定,所以它是一个有效的constexpr。

相关问题