flownt понял все правильно , но я хочу отметить, что в окончательном варианте C ++ 11 (N3337) соответствующий язык был перемещен в раздел 10.3 # 16:
Функция с удаленным определением не должна переопределять функцию
это не имеет удаленного определения. Аналогично, функция, которая
не имеет удаленного определения, не переопределяет функцию с
удаленное определение. 2
Мне кажется, (раздел 8.4.3 # 1) кажется вполне ясным, что удаленное определение фактически считается определением , и фактически встроенное определение, которое означает, что удаленное определение удовлетворяет 10.3 # 11:
Виртуальная функция, объявленная в классе, должна быть определена или объявлена
чистый в этом классе или оба; но диагностика не требуется. 2
Однако, похоже, что текущие реализации не согласны. Вот мой тестовый пример:
struct Base {
virtual void bar();
virtual void foo() = delete;
};
void Base::bar() { } // a definition of the first non-inline virtual function
int main() { Base b; }
Clang создает несвязываемую программу: Base::foo
упоминается в vtable для Base
. И если вы поменяете местами порядок foo
и bar
, компоновщик пожалуется, что отсутствует вся таблица vtable (потому что Clang считает, что foo
- не встроенная функция без определения). Я подал это как ошибку ; посмотрим, что думают разработчики.
GCC жалуется на "использование" foo
в конце блока перевода, когда он создает vtable; но он правильно идентифицирует bar
как первую не встроенную функцию виртуального члена, независимо от порядка foo
и bar
.