在constexpr函数中返回一个C字符串:为什么没有编译器的警告?
问题描述:
考虑下面的代码:在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!"
不会超出该功能的范围...
答
在C++ string literals有static 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
了。
答
这就是的第二个效果的自动。你认为它是什么,并不总是编译器决定的。这可能导致错误的程序员期望 - 规则在这里编译器总是赢得。
这里的事实是str
是一个const char *
到一个(静态存储持续时间)字符串litteral。它可以在构建时完全确定,所以它是一个有效的constexpr。
“字符串文字的类型为const char *'”它们不是。 –
@ T.C。具体长度的const char数组? – Orient
@ T.C。的确,谢谢。 – lisyarus