В cppreference сказано, что
Конструкторы копирования / перемещения не обязательно должны присутствовать или быть доступными в операторе возврата, когда операнд является prvalue того же самого тип класса (игнорируя cv-qualification) в качестве возвращаемого функцией типа:
T f() {
return T();
}
f(); // only one call to default constructor of T
Я правильно понимаю это право, и для того, чтобы приведенный выше пример работал, неизбежно иметь хотя бы одну копию или переместить конструктор?
Я попробовал следующее:
class Player
{
//...
public:
Player();
Player(std::string name);
Player& operator=(const Player&) = delete;
Player& operator=(Player&& p) = delete;
Player(const Player& origin) = delete;
Player(Player&& p) = delete;
Player getEmptyPlayer() const {
return Player("Name");
}
}
//in main:
Player p1("It's Me");
Player p2 = p1.getEmptyPlayer();
Почему этот код компилируется и работает? Насколько я понимаю, метод getEmptyPlayer () должен вызывать конструктор копирования для копирования объекта при возврате. Из-за повышения эффективности компилятором, это не тот случай, но исключается копирование (NRVO), которое напрямую создает объект, где он должен быть, и не создает копию. Тем не менее, cppreference (см. Выше) говорит, что должен существовать доступный или существующий конструктор копирования / перемещения. Так что же здесь происходит?
Заранее спасибо!