【发布时间】:2018-08-06 00:57:14
【问题描述】:
这是Undefined reference to static constexpr char[][] 的后续问题。
以下程序构建并运行良好。
#include <iostream>
struct A {
constexpr static char dict[] = "test";
void print() {
std::cout << A::dict[0] << std::endl;
}
};
int main() {
A a;
a.print();
return 0;
}
但是,如果我将 A::print() 更改为:
void print() {
std::cout << A::dict << std::endl;
}
我在 g++ 4.8.2 中收到以下链接器错误。
/tmp/cczmF84A.o:在函数“A::print()”中: socc.cc:(.text._ZN1A5printEv[_ZN1A5printEv]+0xd): 对‘A::dict’的未定义引用 collect2:错误:ld 返回 1 个退出状态链接器错误可以通过添加一行来解决:
constexpr char A::dict[];
在类定义之外。
但是,我不清楚为什么使用数组的成员之一不会导致链接器错误,而使用数组会导致链接器错误。
【问题讨论】:
-
因为前者需要一个值,而后者需要一个地址?
-
我认为两者都是 odr-uses。在
dict[0]案例中,您刚刚(不)走运。 -
clang 也不喜欢您的第一个版本,提供与您的第二个版本相同的未定义参考消息。
-
g++ 似乎在幕后做了一些不该做的有趣事情。