在C++ 03中,用作模板参数的符号必须具有外部链接; 这种限制在C++ 11被除去,如在探讨这个前面的问题:
在C++ 03中,模板参数不能具有内部链接:
[C++03: 14.6.4.2/1]:对于依赖于模板参数的函数调用,如果函数名称是unqualified-id但不是template-id,则使用通常的查找规则(3.4.1,3.4.2)找到候选函数,除了:
- 对于使用非限定名称查找(3.4.1)的查找部分,仅找到具有来自模板定义上下文的外部链接的函数声明.
- 对于使用关联命名空间(3.4.2)的查找部分,仅找到在模板定义上下文或模板实例化上下文中找到的具有外部链接的函数声明.
[..]
在C++ 11 中更改了(问题#561:"依赖名称查找中的内部链接函数"):
[C++11: C.2.6]:14.6.4.2
更改:允许具有内部链接的函数的依赖调用
原理:过度约束,简化重载决策规则.导致:
[C++11: 14.6.4.2/1]:对于依赖于模板参数的函数调用,使用通常的查找规则(3.4.1,3.4.2,3.4.3)找到候选函数,除了:
- 对于使用非限定名称查找(3.4.1)或限定名称查找(3.4.3)的查找部分,仅找到模板定义上下文中的函数声明.
- 对于使用关联命名空间(3.4.2)的查找部分,仅找到在模板定义上下文或模板实例化上下文中找到的函数声明.
[..]
(发现缺少"与外部联动"的资格.)
问题#561("依赖名称查找中的内部链接功能"),导致在C++ 11中删除限制的提议,请求:
此外,是否真的有必要从查找中排除内部链接功能?ODR是否为实现提供足够的自由度来处理这种情况而不会在名称查找上产生另一个问题?
随后回答:
该小组的共识是,[...]内部链接函数应该通过查找找到(尽管如果通过重载解析选择它们可能会导致错误).
限制的最初实践理由是什么?
似乎必须有一个,因为原始的标准措辞不会限制查找到具有外部链接的符号.
是否只是"[内部联动功能]可能导致错误,如果通过重载决议选择",并且通过2000年代的意见转移了这是多么重要?或者做了一些其他改变,也许是因为其他C++ 11功能的新措辞的间接结果?
如果您在C++中使用以整数值作为参数的模板,那么对于用作参数的整数变量是否有任何要求,如果该变量在函数调用中用作参数?
这是一个后续问题 在这里.如果WRT变量声明为函数或模板的"extern const int",我特别想解决这个问题吗?
我可以看到,对于某些模板情况,编译时需要参数值.这总是如此吗?有没有办法指定(可能仅用于参数值的某些用途)该值是否在运行时使用?