Рассмотрим следующий пример:
class X {
public:
X() = default;
X(const X&) = default;
X(X&&) = delete;
};
X foo() {
X result;
return result;
}
int main() {
foo();
}
Clang и GCC не согласны с тем, действительно ли эта программа. GCC пытается вызвать конструктор перемещения при инициализации временного во время вызова foo()
, который был удален, что приводит к ошибке компиляции. Кланг обрабатывает это просто отлично, даже с -fno-elide-constructors
.
Может ли кто-нибудь объяснить, почему GCC разрешено вызывать конструктор перемещения в этом случае? Не result
lvalue?