Ответ 1
Ошибка библиотеки - она показывает true, true, true, true, true
в gcc 4.7.
И ошибка не в том, что сгенерированные конструкторы движений не исключают, но что std::move
не помечено как noexcept
, как мы можем видеть с дополнительными тестами:
std::cout << noexcept(a = static_cast<foobar&&>(b)) << ", " // true
<< noexcept(foobar(static_cast<foobar&&>(b))) << ", " // true
<< noexcept(std::move(b)) << std::endl; // false
Большинство библиотечных функций в gcc 4.6 не было noexcept-correct, и это было рассмотрено в gcc 4.7,
В том случае, когда функции с неограниченным числом членов не исключают, это описано в п. 15.4/14. В принципе, это noexcept
, если все функции, которые ему нужно вызвать, это все noexcept
.
Неявно объявленная специальная функция-член (пункт 12) должна иметь спецификацию исключения. Если
f
неявно объявленный конструктор по умолчанию, конструктор копирования, конструктор перемещения, деструктор, назначение копии оператора или оператора присваивания, его неявная спецификация исключений указывает тип-idT
, если и только еслиT
разрешено спецификацией исключения функции, непосредственно вызванной неявным определениемf
s;f
разрешить все исключения, если какая-либо функция, которую он вызывает напрямую, допускает все исключения, иf
не допускает исключений если каждая функция, которую он вызывает напрямую, не допускает исключений.