Недавно я начал добавлять новую спецификацию noexcept
для перемещения конструкторов / назначений, где это возможно.Теперь я начал задаваться вопросом, как выглядит спецификация исключений неявных сгенерированных функций-членов.Поскольку наличие noexcept
функций перемещения позволяет использовать более эффективные пути кода (например, при изменении размера vector
), я надеюсь, что они объявляются как noexcept, когда это возможно.У меня были проблемы с пониманием того, что стандарт говорит об этом, и поэтому попробовал следующий код в g ++ 4.6 (с -std=c++0x
), чтобы получить некоторое представление об этом:
struct foobar{};
int main()
{
foobar a, b;
std::cout<<std::boolalpha
<<noexcept(foobar())<<", "<<noexcept(foobar(a))<<", "
<<noexcept(a = b) <<", "<<noexcept(a = std::move(b))<<", "
<<noexcept(foobar(std::move(a)))<<std::endl;
}
Это дало мне выводTrue, True, True, False, False
, что означает, что по умолчанию и скопировать конструктор / присваивание, где noexcept
, в то время как операция перемещения, где нет.
Теперь на мой вопрос:
При каких обстоятельствах неявно генерируемые (или дефолтные) функции-члены объявляются как noexcept
?Кроме того, правильное поведение для foobar
корректно или просто ошибка компилятора в gcc4.6?