微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

内部链接规则能否破坏 c++11 中的有效 c++03 代码?

如何解决内部链接规则能否破坏 c++11 中的有效 c++03 代码?

如果c++03中存在有效代码,是否会因为引入了内部链接规则而在c++11中中断?

Clause C.2.6 Clause 14: templates point 3 14.6.4.2

我想不出任何例子。

感谢任何帮助。

解决方法

作为参考,这是 §14.6.4.2 [temp.dep.candidate]“候选函数”的 C++03 版本:

对于依赖模板参数的函数调用,如果函数名称是 unqualified-id 而不是 template-id,则使用以下方法找到候选函数通常的查找规则 (3.4.1,3.4.2) 除了:

  • 对于使用非限定名称查找 (3.4.1) 的查找部分,只能找到来自模板定义上下文的具有外部链接的函数声明。
  • 对于使用关联命名空间 (3.4.2) 的查找部分,仅在模板定义上下文或模板实例化上下文中找到具有外部链接的函数定义。

如果调用格式错误或找到更好的匹配,则在关联命名空间中的查找考虑所有翻译单元中这些命名空间中引入的具有外部链接的所有函数声明,而不仅仅是考虑在模板中找到的那些声明定义和模板实例化上下文,则程序具有未定义的行为。

您可以制作一些示例代码,这些代码可以在 C++03 中很好地定义,但不能在 C++11 中定义:

#include <iostream>

void print(short x) {
    std::cout << x;
}

static void print(long x) {
    std::cout << x;
}

template<typename T>
void print_twice(T x) {
    print(x);
    print(x);
}

int main() {
    print_twice(0);
    // C++03: `void print(long)` does not have external linkage so is not considered.
    //        Calls `void print(short)` twice
    
    // C++11: Both `void print(long)` and `void print(short)` are viable,//        but neither is better so it is ambiguous (compile time error)
}

(虽然 clang 和 gcc 似乎没有实现 C++03 版本的 ADL,所以至少在使用这些编译器进行编译时永远不会出现)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。