【发布时间】:2016-01-14 15:31:17
【问题描述】:
跟进这个问题Having a constexpr static string gives a linker error
在问题中,此代码无法编译:
#include <iostream>
struct Test { static constexpr char text[] = "Text"; };
int main()
{
std::cout << Test::text << std::endl; // error: undefined reference to `Test::text'
}
从评论来看,这段代码可以编译:
#include <iostream>
struct Test { static constexpr auto text = "Text"; };
int main()
{
std::cout << Test::text << std::endl;
}
我的问题是为什么auto 版本可以工作,而char 版本的数组却不行?
您能否指出标准中允许第二个版本和不允许第一个版本的声明?
我看了Strange behavior with constexpr static member variable,但似乎是另一个问题。
【问题讨论】:
-
这是同一个问题,同样接受的答案是有效的:stackoverflow.com/a/28534978/113662 即两个版本都是错误的,但编译器没有义务拒绝它们,它选择接受其中一个
-
@TadeuszKopec 不,后者不是病态的。
-
@TadeuszKopec 我错过了 Sahu 的答案,这是对已接受答案的补充。在萨胡的回答中,提到了文字类型。而且,我误解了,文本将被推导出 char[] 而不是 char*
-
@Columbo 你是对的,这里提到的例外情况。
标签: c++ c++11 language-lawyer constexpr auto