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静态成员变量的奇怪行为,但它似乎是另一个问题.
类中静态数据成员的声明永远不是定义.
您的示例之间的区别在于只有一个需要定义text.
的auto版本推导char const*的,因此text仅须左值到右值转换和不ODR使用.相比之下,第一个代码有效地传递了text地址,使用了它 - 即需要定义.