我确实明白 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/

10-11 22:01