下面的代码在GCC上编译得很好,但在Clang上没有编译,为什么?如果我理解正确,静态constexpr表达式必须在线外定义,这就是我所做的,但它似乎不起作用。
struct Foo;
template <typename T>
struct Bar;
template <>
struct Bar<Foo> {
static constexpr char const * foo[] = { "foo" };
};
constexpr char const * Bar<Foo>::foo[];
#include <iostream>
int main(void) {
std::cout << Bar<Foo>::foo[0] << std::endl;
}
产生以下内容:
❯ [DESKTOP-NJURELH?] /tmp ❯ clang++-5.0 -std=c++17 z.cc
/tmp/z-e6820c.o: In function `main':
z.cc:(.text+0x16): undefined reference to `Bar<Foo>::foo'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我在这里找到了一个可能相关的问题:Undefined reference to static constexpr,但答案建议使用一个通用的定义,这不是我能做的(Bar<Foo>
必须是一个专门化,模板本身没有定义)。