Следующее не компилируется, потому что RVO отключен при возврате указателя или ссылки?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Следующее не компилируется, потому что RVO отключен при возврате указателя или ссылки?

Сообщение Anonymous »

У меня есть класс, который можно только перемещать, и я не могу вернуть его, когда у меня есть указатель на него или ссылка на него:

Код: Выделить всё

struct TestCase
{
TestCase() {}
TestCase(const TestCase&) = delete;
TestCase(TestCase&&) {}
TestCase& operator=(const TestCase&) = delete;
TestCase& operator=(TestCase&&) { return *this; }
};

TestCase funcReturningOnlyMovableType()
{
TestCase test_case;
TestCase* ptr_test_case = &test_case;
TestCase& ref_to_test_case = test_case;

return test_case; // WORKS
//return *ptr_test_case; // DOESN'T WORK COPY CONSTRUCTOR IS DELETED
//return ref_to_test_case; // DOESN'T WORK COPY CONSTRUCTOR IS DELETED
}

int main()
{
TestCase test_case = funcReturningOnlyMovableType();
}
Это потому, что RVO отключен при использовании указателя или ссылки для возврата объекта? И поэтому нужно вызывать конструктор копирования?
Это случилось со мной в MSVC, но с тех пор я проверил Compiler Explorer, и то же самое происходит в GCC и Clang.

Подробнее здесь: https://stackoverflow.com/questions/791 ... rning-a-po
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»