gpt4 book ai didi

c++ - 非类型(引用)模板参数和链接

转载 作者:太空狗 更新时间:2023-10-29 23:40:03 26 4
gpt4 key购买 nike

在下面,

int i{3};
const int j{3};
extern const int k{3};

template <typename T, T&>
void f() {}

int main()
{
f<int, i>(); // OK
f<int const, j>(); // not valid template argument: 'j' has not external linkage
f<int const, k>(); // OK
}

GCC 给出使用 j 作为模板参数的错误,而 clang 编译正常。

  • ij的联系是什么?
  • 为什么 const/non-const 有区别?
  • 谁是正确的? GCC 还是 clang?

最佳答案

正如 Kerrek 在评论中指出的那样,命名空间级别的 const 变量具有内部链接(除非您使用 extern 关键字)。在 C++03 中,您不能将具有内部链接的变量的指针或引用用作非类型模板参数。这个限制在 C++11 中被取消了。看来您的 gcc 版本正在按照 C++03 规则运行,而 clang 编译器正在使用 C++11 规则。


14.3.2 [temp.arg.nontype]/1

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

  • [...]
  • a constant expression (5.19) that designates the address of an object with static storage duration and external or internal linkageor a function with external or internal linkage, including functiontemplates and function template-ids but excluding non-static classmembers, expressed (ignoring parentheses) as & id-expression, exceptthat the & may be omitted if the name refers to a function or arrayand shall be omitted if the corresponding template-parameter is areference; or
  • [...]

关于c++ - 非类型(引用)模板参数和链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23479015/

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