在一个constexpr函数中返回一个C字符串:为什么编译器没有警告?

8
请考虑以下代码:
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!”不要超出函数范围...

2个回答

14
在C++中,字符串字面量具有静态存储期,并且与程序运行的时间一样长。因此,从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不是字面类型,因此这些值不能再是constexpr

2
字符串字面量的类型是 const char *。事实并非如此。 - T.C.
@T.C. const char 数组长度具体吗? - Tomilov Anatoliy

5

这是auto的第二个作用。你认为的不一定是编译器决定的,这可能会导致程序员期望错误 - 规则在这里,编译器总是胜利。

事实是,str是指向(静态存储期)字符串字面量的const char *。它可以在构建时完全确定,因此它是一个有效的constexpr。


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