我问自己以下示例为何起作用,并且在实例化extern
时说明符baz_instance
做了什么:
struct baz {
int value;
};
extern const baz baz_instance = {3};
template<baz const& b>
int foo(){
return b.value;
}
int main(){
foo<baz_instance>();
return 1;
}
为什么上面的代码首先编译,如果省略了
extern
说明符,为什么不再编译呢?在此示例中,extern
说明符做什么? 最佳答案
这是从C++ 03更改为C++ 11的标准的组成部分之一。
在C++ 03中,[temp.arg.nontype]读取为:
在C++ 11中,由于issue 1155而进行了更新,尽管GCC对此行为仍然具有a bug:
在C++ 14中,这甚至进一步简化了,甚至没有提到链接。
对于您的特定问题,extern
说明符将外部链接添加到baz_instance
。没有它,baz_instance
具有内部链接。在C++ 03中,您需要外部链接以具有引用类型的非类型模板参数。在C++ 11中,您不再需要-不再需要extern
,并且无需它就可以正常编译。