【问题标题】:Returning a C string in a constexpr function: why no warning from the compiler?在 constexpr 函数中返回 C 字符串:为什么编译器没有警告?
【发布时间】:2017-07-28 06:54:24
【问题描述】:

考虑以下代码:

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++ c++14 constexpr c-strings string-literals


    【解决方案1】:

    在 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

    【讨论】:

    • "字符串文字的类型为 const char *" 他们没有。
    • @T.C. const char 数组的具体长度?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-14
      • 2014-06-19
      • 2016-12-18
      • 1970-01-01
      • 2013-04-03
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多