Я просто заметил, что мое std::vector<Foo>
копировало вместо перемещения его элементов при изменении размера - даже если Foo
имеет ctor перемещения:
class Foo {
// ...
Foo(Foo&& other) : id_(other.id_), ptr_(other.ptr_), flag(other.flag)
{
other.flag = false;
};
// ...
int id_;
void* ptr_;
bool flag;
}
Тогда я прочитал:
Изменение размера в std :: vector не вызывает конструктор перемещения
, что напомнило мне, что std::vector
будет использовать конструкцию перемещения только в том случае, если объявлен ctor перемещения элементов noexcept
.Когда я добавляю noexcept
, вызывается ctor-ход.
Мой вопрос: почему, учитывая код ctor-перемещения, компилятор не определяет, что он равен noexcept
?Я имею в виду, он может знать, что исключение не может быть выброшено.Кроме того, вывод стандарта noexcept
запрещен стандартом или не выполняется моим конкретным компилятором?
Я использую GCC 5.4.0 в GNU / Linux.