我问自己以下示例为何起作用,并且在实例化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,并且无需它就可以正常编译。

09-25 18:53
查看更多