今天我遇到了一些编译器行为,这对我来说似乎很奇怪。请考虑以下代码:
#include <iostream>
#include <algorithm>
struct test {
static const int x = 1;
static const int y = 2;
};
int main() {
std::cout << std::min(test::x, test::y) << std::endl;
return 0;
}
编译时(使用g ++ 5.4,6.3或clang ++ 4.0),链接器会抱怨它无法解析两个符号test :: x和test :: y。
$ clang++ test.cpp -o test
/tmp/test-3cd074.o: In function `main':
test.cpp:(.text+0xa): undefined reference to `test::x'
test.cpp:(.text+0x14): undefined reference to `test::y'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
但是,当显式(并且冗余地)将静态成员转换为其原始类型时,编译成功:
int main() {
std::cout << std::min(static_cast<const int>(test::x), static_cast<const int>(test::y)) << std::endl;
return 0;
}
这导致了预期的结果:
$ clang++ test.cpp -o test && ./test
1
只需通过std :: cout输出变量就可以在没有强制转换的情况下工作,因此使用值初始化另一个变量:
std::cout << test::x << std::endl; // Works!
int z = test::y; // Works as well!
现在我的问题是:当静态成员没有被转换时,为什么链接器不能解析符号?在模板外部访问成员时,为什么访问成员不是问题?