gpt4 book ai didi

c++ - 使用 extern const 将结构传递给模板。什么是外部?

转载 作者:可可西里 更新时间:2023-11-01 16:07:01 26 4
gpt4 key购买 nike

我在问自己为什么下面的代码有效,以及说明符 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] 为:

A template-argument for a non-type, non-template template-parameter shall be one of:

  • [...]
  • [...]
  • the address of an object or function with external linkage, including function templates and function template-ids but excluding non-static class members, expressed as & id-expression where the & is optional if the name refers to a function or array, or if the corresponding template-parameter is a reference; or
  • [...]

在 C++11 中,由于 issue 1155 而得到更新, 虽然 GCC 仍然有 a bug关于这种行为:

  • a constant expression (5.19) that designates the address of a complete object with static storage duration and external or internal linkage or a function with external or internal linkage, including function templates and function template-ids but excluding non-static class members, expressed (ignoring parentheses) as & id-expression, where the id-expression is the name of an object or function, except that the & may be omitted if the name refers to a function or array and shall be omitted if the corresponding template-parameter is a reference; or

在 C++14 中,这得到了进一步简化,甚至没有提到链接。

关于您的具体问题,extern 说明符将外部链接添加到 baz_instance。没有它,baz_instance 就有内部链接。在 C++03 中,您需要外部链接才能拥有引用类型的非类型模板参数。在 C++11 中,你不再需要了——所以 extern 不再是必需的,没有它它也能正常编译。

关于c++ - 使用 extern const 将结构传递给模板。什么是外部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31003857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com