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