Я не уверен, что это ошибка компилятора 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.
В настоящее время ошибка по-прежнему не подтверждена. Я обновлю вопрос как можно скорее.