Неявно сгенерированные члены и noexcept

Недавно я начал добавлять новую спецификацию 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?

19
задан Grizzly 7 February 2012 в 16:53
поделиться