类型恒等规则及其违反
Type identity rule and its violation
在违反类型同一性规则的代码下面:
#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++用于异常和角落情况的规则时。
相关文章:
- C++中的严格别名规则和类型别名
- 使用C++11标准的哪些规则来确定({..})中表达式的类型
- 如何在不违反类型别名规则的情况下解释消息负载?
- 强制转换为不相关的引用类型是否违反严格的别名规则?
- POD 类型的二进制 I/O 如何不违反别名规则
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 有关不完整类型的Sfinae的特殊规则
- 精神X3,如何获得属性类型以匹配规则类型
- C++20 中的严格别名规则是否允许标准 c++ unicode 字符和下划线类型之间"reinterpret
- 初始化中的模板转换运算符类型推导规则是什么?
- 将临时值存储为某种数据类型时,算术运算的标准规则是什么
- MISRA C++规则 14-5-1:在与类型关联的命名空间中声明的泛型函数模板的名称
- 本地类规则是否与c++14返回类型推导一致
- 将字符阵列施放到另一种类型中是否违反了严格的确定规则
- 要求将各种类型的各种类型传递给微控制器上的规则引擎.施放问题
- 隐式数值类型转换的规则
- 在makefile中更改构建规则以构建多种文件类型
- 用删除类型的指针的stof()/stoi()将打破严格的确定规则
- C++函数类型模板参数推导规则
- 为什么提升区域设置不提供字符级别规则类型?