使用extern const将结构传递给模板.什么是外部人员?

smo*_*oes 10 c++ templates struct const extern

我问自己为什么以下代码有效以及说明符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;
}
Run Code Online (Sandbox Code Playgroud)

为什么上面的代码首先编译,如果extern省略说明符,为什么不编译?什么是extern符在这个例子吗?

Bar*_*rry 6

这是标准中从C++ 03更改为C++ 11的部分之一.

在C++ 03中,[temp.arg.nontype]读取:

非类型非模板模板参数的模板参数应为以下之一:

  • [...]
  • [...]
  • 具有外部链接的对象或函数的地址,包括函数模板和函数template-id,但不包括非静态类成员,表示为&id-expression,其中&是可选的,如果名称引用函数或数组,或者如果相应的模板参数是参考; 要么
  • [...]

在C++ 11中,由于问题1155而得到更新,尽管GCC仍然存在与此行为有关的错误:

  • 一个常量表达式(5.19),用于指定具有静态存储持续时间和外部或内部链接的完整对象的地址,或具有外部或内部链接的函数,包括函数模板和函数模板ID,但不包括非静态类成员,表达(忽略括号)as&id-expression,其中id-expression是对象或函数的名称,除非如果名称引用函数或数组,可以省略&,如果相应的模板参数是参考; 要么

在C++ 14中,它进一步简化,甚至没有提到链接.

至于你的具体问题,说明extern符添加了外部链接baz_instance.没有它,baz_instance就有内部联系.在C++ 03中,您需要外部链接以具有引用类型的非类型模板参数.在C++ 11中,你不再是 - 所以extern不再需要它,没有它就可以很好地编译.