Почему конструктор копирования не вызывается при возврате по значению объекта, инициализированного списком?
Я понимаю, что когда объекты возвращаются по значению из функции, вызываются их конструкторы копирования. Если у класса есть удаленный конструктор копирования, возврат по значению завершится неудачей.
struct X {
X(const X &) = delete;
};
X f() {
return X{};
}
error: call to deleted constructor of 'X'
C ++ 11 дает нам расширенные инициализаторы. И я читал где-то на ТАКОМ посте, что это
X f() {
return {};
}
такой же как
X f() {
return X{};
}
Так почему же приведенный ниже код не выдаст мне ошибку? Это проходит, и я даже вызываю функцию в main:
struct D {
D(const D &) = delete;
};
D f() { return {}; }
int main()
{
f();
}
Вот демо. Об ошибках не сообщается. Я нахожу это странным, потому что я считаю, что должен быть вызван конструктор копирования. Может кто-нибудь объяснить, почему не дается ошибка?