类型恒等规则及其违反

Type identity rule and its violation

本文关键字:规则 类型      更新时间:2023-10-16

在违反类型同一性规则的代码下面:

#include <iostream>
void foo()
{
    typedef int I;
    extern I a; //now a is denoting an entity, which is a member of global scope
    std::cout << a;
}
typedef char I;
I a; //definition of a
int main()
{
    foo();
}

类型同一性规则。3.6/10 N3797):

所有类型调整完成后(在此过程中typedefs (7.1.3))由它们的定义取代),所有指定的类型引用的声明必须为相同,只是数组对象的声明可以指定因是否存在主数组而不同的数组类型绑定(8.3.4)。在类型标识上违反此规则的

我明白违反该规则不需要诊断。为什么不呢?

引号中的规则意味着你的违规行为调用了未定义行为

不完全指定行为的原因是:

  • 易于实现。
  • 程序效率。
  • 迎合不同的现有实现。
  • 允许扩展和未来的发展。

在您的情况下,如果错误分布在多个实现单元中,大多数对象文件类型将不包含诊断错误所需的信息。
这使得诊断变得困难甚至不可能。

无论如何,由于c++不包含任何访问具有相同名称的不同对象的方法,因此将这些信息放入对象文件中并不是一个好主意,特别是当链接器必须知道所有 c++用于异常和角落情况的规则时。