Я не уверен, является ли это ошибкой компилятора GCC или предполагаемым поведением noexcept
.
Рассмотрим следующий пример:
struct B {
B(int) noexcept { }
virtual void f() = 0;
};
struct D: public B {
using B::B;
D() noexcept(noexcept(D{42})): B{42} { }
void f() override { }
};
int main() {
B *b = new D{};
}
Если noexcept
удалить, он компилируется.
Во всяком случае, как и в примере, я получил эту ошибку от GCC v5.3.1:
test.cpp:8:31: error: invalid use of incomplete type ‘struct D’
D() noexcept(noexcept(D{42})): B{42} { }
^
Насколько я знаю, struct D
не является неполным типом, но в операторе участвуют наследующие конструкторы, и похоже, что компилятор на самом деле рассматривает полноту базовой структуры B
больше, чем D
.
Это предполагаемое поведение или это юридический кодекс?
Для большей ясности:
- здесь компиляция прошла успешно с использованием clang 3.7.1
- здесь компиляция завершается ошибкой с использованием GCC 5.3.0
См. эту ссылку на bugzilla для Компилятор GCC для получения дополнительной информации.
В настоящее время ошибка все еще не подтверждена. Я обновлю вопрос как можно скорее.
main.cpp:6:8: note: definition of 'struct D' is not complete until the closing brace
. Тем не менее я думаю, что это ошибка компилятора GCC. - person skypjack   schedule 04.03.2016