内部链接规则可以破坏c ++ 11中的有效c ++ 03代码吗?

一个学习者

如果c ++ 03中有有效的代码,是否由于引入了内部链接规则而在c ++ 11中中断?

第C.2.6条第14条:模板第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似乎未实现ADL的C ++ 03版本,所以至少在使用这些编译器进行编译时,这永远不会出现)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果代码使用“隐式布尔转换”。有效的c ++ 03代码可以在c ++ 11中中断吗?

C ++代码在C ++ 03和C ++ 11中都可以有效,但是做不同的事情吗?

工作C ++ 03代码上的G ++(C ++ 14)链接器错误

在C11中指向匿名联合的指针强制转换有效吗?

尝试将C ++ 11代码转换为C ++ 03时默认函数模板参数出错

Visual Studio 2017的“实现接口”命令可以生成C#5代码吗?

这是在C ++ 03中执行“ Expression SFINAE”的有效方法吗?

在C ++中,delete []确实有效吗?

有效的C ++仍然有效吗?

标准库中的 c++ 代码都是有效的 c++ 吗?

这被认为是有效的c ++ 11或c ++ 14吗?还是gcc / clang弄错了?

Firestore 规则可以有例外吗?

我可以使用C#预处理器跳过Kinect v2.0代码吗?

C打印f。这是有效的代码吗?

使用Visual Studio 2013编译C ++ 11代码

这是有效的C ++ 11

我可以在没有图形卡或MESA的计算机上编程/编译OpenGL 4.0代码吗?

这可以被认为是 C++ 中单例类的有效实现吗?

在 C 中模糊图像:代码只有一半有效

具有有效索引的数组未在c中返回正确的状态代码

交换整数的代码在C ++中有效,但在C中不起作用

在Windows IDE中编写C++代码并在Linux终端中编译的有效方法?

这是Item28中“更有效的C ++”中的错误吗?

有人可以使用C#统一代码在我的测验游戏中为我提供帮助吗

以下语句在ANSI C中有效吗?真的有效吗?

C# 中的简单 SQLite ORM,代码有效但如何解决竞争条件

为什么来自Bjarne的“ C ++旅游”中的这段代码有效?

存储过程在DB中有效,但在C#代码中无效

在VIsual Studio中运行MFC C ++代码错误NewFolder不是有效的工作目录