使用 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 它 - 即需要一个定义。