首页 > 解决方案 > `final` 是否违反 ODR?

问题描述

// file1.cpp
struct Foo {
    virtual void boo() final;
};


// file2.cpp
struct Foo {
    virtual void boo();
};

这是 ODR,还是其他违反语言规则的行为?

标签: c++11

解决方案


是的,这违反了适用于Foo.

[basic.def.odr] 第 6 段:

如果每个定义出现在不同的翻译单元中,并且定义满足以下要求,则程序中可以有多个类类型的定义... [或在头文件中经常定义的其他实体] ... 给定这样一个D在多个翻译单元中定义的实体,那么

  • 的每个定义D应由相同的标记序列组成;和

  • ... [确保所有定义在其上下文中具有相同含义的其他规则]

因此,预处理步骤之后类类型定义之间的任何差异都会给程序带来未定义的行为,甚至更改未使用的函数参数的名称、更改unsigned intint unsigned等等。


推荐阅读