Недавно я начал добавлять новую спецификацию noexcept
для перемещения конструкторов/назначений, где это возможно. Теперь я начал задаваться вопросом, как выглядит спецификация исключения неявных сгенерированных функций-членов. Поскольку функция noexcept
move позволяет использовать более эффективные пути кода (например, при изменении размера a vector
), я надеюсь, что они будут объявлены как неэксключные, когда это возможно. У меня возникли проблемы с пониманием того, что стандарт должен сказать об этом, и поэтому попробовал следующий код в 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
? Кроме того, является obseved поведение для foobar
правильного или просто ошибки компилятора в gcc4.6?