我确实明白 ODR 说的是什么,但我不明白它试图实现什么。
我看到违反它的两个后果 - 用户会收到语法错误,这完全没问题。而且也可能有一些致命的错误,而且用户将是唯一有罪的人。
作为违反 ODR 并得到一些致命错误的例子,我想像这样:
a.cpp
struct A
{
int a;
double b;
};
void f(A a)
{
std::cout << a.a << " " << a.b << std::endl;
}
主程序
struct A
{
int a;
int b;
};
void f(A a);
int main()
{
A a = {5, 6};
f(a);
return 0;
}
如果示例与 ODR 无关,请纠正我。
那么,ODR 是否试图禁止用户做这种有害的事情?我不这么认为。
它是否试图为编译器编写者设置一些规则,以避免违反它的潜在危害?可能不会,因为大多数编译器不检查 ODR 违规。
还有什么?
最佳答案
ODR 决定了哪些 C++ 程序是结构良好的。 ODR 违规意味着您的程序格式错误,并且标准没有规定程序将做什么,是否应该编译等。大多数 ODR 违规被标记为“无需诊断”,以使编译器编写者的工作更轻松。
这允许 C++ 编译器对您提供给它的代码做出某些简化的假设,例如 ::A
在任何地方都是相同的结构类型,而不必在每个使用点进行检查。
编译器可以随意获取您的代码并将其编译为格式 c:。或者别的什么。可以免费检测 ODR 违规,并用它来证明代码分支无法运行,并消除通向那里的路径。
关于c++ - ODR 的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38030754/