使用 constexpr auto/char-array 变量观察到的不同行为
Different behavior observed with constexpr auto/char-array variable
跟进这个问题
在问题中,这段代码无法编译:
#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
版本的数组无效?
能否请您指出标准中允许第二个版本而不允许第一个版本的声明?
我看了一下,但好像是另一个问题。
struct Test { static constexpr auto text = "Text"; };
解析为
struct Test { static constexpr const char * text = "Text"; };
所以第二个表达式是 constexpr
指针的值而不是数组。
class 中静态数据成员的声明永远不是定义。
您的示例之间的区别在于,只有一个示例需要定义 text
.
auto
版本推导出 char const*
,因此 text
仅受 lvalue-to-rvalue 转换而不是 odr-used。相比之下,第一个代码有效地传递了 text
的地址,odr-use-ing 它 - 即需要一个定义。
跟进这个问题
在问题中,这段代码无法编译:
#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
版本的数组无效?
能否请您指出标准中允许第二个版本而不允许第一个版本的声明?
我看了一下
struct Test { static constexpr auto text = "Text"; };
解析为
struct Test { static constexpr const char * text = "Text"; };
所以第二个表达式是 constexpr
指针的值而不是数组。
class 中静态数据成员的声明永远不是定义。
您的示例之间的区别在于,只有一个示例需要定义 text
.
auto
版本推导出 char const*
,因此 text
仅受 lvalue-to-rvalue 转换而不是 odr-used。相比之下,第一个代码有效地传递了 text
的地址,odr-use-ing 它 - 即需要一个定义。