`final` нарушает ODR? - PullRequest
       1

`final` нарушает ODR?

0 голосов
/ 19 мая 2018
// file1.cpp
struct Foo {
    virtual void boo() final;
};


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

Это ODR или какое-либо другое нарушение правил языка?

1 Ответ

0 голосов
/ 19 мая 2018

Да, это нарушение ODR применительно к определению Foo.

[basic.def.odr] параграф 6:

Можнобыть более чем одним определением типа класса ... [или другими объектами, часто определяемыми в заголовочных файлах] ... в программе при условии, что каждое определение появляется в другой единице перевода, и при условии, что определения удовлетворяют следующим требованиям.Если такой объект с именем D определен более чем в одной единице перевода, то

  • , каждое определение D должно состоять из одной и той же последовательности токенов;и

  • ... [другие правила, обеспечивающие одинаковое значение всех определений в их контексте]

Так что любая разницамежду определениями типов классов после этапов предварительной обработки программа получает неопределенное поведение, даже изменяя имя неиспользуемого параметра функции, изменяя unsigned int на int unsigned и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...