“最终”是否违反了ODR?

时间:2018-05-19 01:47:18

标签: c++11

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


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

这是ODR还是其他一些语言规则违规?

1 个答案:

答案 0 :(得分:5)

是的,这违反了ODR,适用于Foo的定义。

[basic.def.odr]第6段:

  

可以有多个类类型的定义... [或在头文件中经常定义的其他实体] ...在程序中提供每个定义出现在不同的翻译单元中,并且如果定义满足以下要求。鉴于在多个翻译单元中定义了名为D的实体,那么

     
      
  • D的每个定义都应包含相同的令牌序列;以及

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

  •   

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