使用constexpr auto/char-array变量观察到不同的行为

Dan*_*anh 4 c++ language-lawyer constexpr auto c++11

跟进这个问题有一个constexpr静态字符串会给出一个链接器错误

在这个问题中,这段代码无法编译:

#include <iostream>

struct Test { static constexpr char text[] = "Text"; };

int main()
{
    std::cout << Test::text << std::endl; // error: undefined reference to `Test::text'
}
Run Code Online (Sandbox Code Playgroud)

从评论中,这段代码能够编译:

#include <iostream>

struct Test { static constexpr auto text = "Text"; };

int main()
{
    std::cout << Test::text << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么auto版本可以工作,但版本的数组char没有?

能不能指出标准中的声明允许第二个版本而不允许第一个版本?

我看了一下constexpr静态成员变量的奇怪行为,但它似乎是另一个问题.

Col*_*mbo 8

类中静态数据成员的声明永远不是定义.
您的示例之间的区别在于只有一个需要定义text.

auto版本推导char const*的,因此text仅须左值到右值转换和不ODR使用.相比之下,第一个代码有效地传递了text地址,使用了它 - 即需要定义.