Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2022, 15:25   #1
artur567297gmail
Новичок
Джуниор
 
Регистрация: 04.08.2022
Сообщений: 1
По умолчанию Почему RWO не вызывается при operator* указателя?

Здравствуйте. Оператор уникального указателя operator* при возвращении объекта для которого указатель был создан возвращает копию объекта а должен вроде ссылку?

Например:
Я создал указатель для объекта: unique_ptr<MyObect> my_pointer(new MyObect ());
Далее получаю ссылку на сам класс MyObect с помощью указателя my_pointer:
MyObect obect = *my_pointer – и вот здесь почему то не вызывается rwo а вызывается конструктор копирования класса MyObect а мне нужно получить саму ссылку. В классе unique_ptr есть переопределенный оператор * - этот оператор ведь должен возвращать ссылку на объект без вызова всяких конструкторов копирования? Но почему то возвращает именно копию.

Я для примера создал свой класс уникального указателя вот его код:
template <typename T>
class smart_pointer
{
private:
T* rawPtr;
public:
smart_pointer(T* pData) : rawPtr(pData) {}
~smart_pointer() { delete rawPtr; };

T& operator* () const
{
return *(rawPtr);
}

T* operator-> () const
{
return rawPtr;
}
};
Здесь обратите внимание на T& operator* - все условия для вызова RWO есть: одна инструкция, нужный тип в итоге должно сработать rwo и вернуться сама ссылка но нет тоже как и в unique_ptr вызывается конструктор копирования.
artur567297gmail вне форума Ответить с цитированием
Старый 04.08.2022, 20:41   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

artur567297gmail, для RVO нужно возвращать объект по значению.

А тут - возвратилась бы ссылка, если бы метод сам был не константный. Но, поскольку он константный, а вернуть нужно неконстантную ссылку, то (как мне кажется - точно сказать не могу) делается копия, и возвращается ссылка на временный объект (то есть, насколько я понимаю, это UB )

должно быть так
Код:
	const T& operator* () const noexcept
	{
		return *(rawPtr);
	}

	T& operator* () noexcept
	{
		return *(rawPtr);
	}
до кучи - нарушено правило пяти

Последний раз редактировалось Алексей1153; 04.08.2022 в 20:43.
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[РЕШЕНО][Delphi] Ошибка 'Operator not applicable to this operator type'. Почему? Есть код. IlyaHistorik Помощь студентам 3 21.10.2017 19:37
Почему деструктор вызывается два раза? 220Volt Общие вопросы C/C++ 18 09.01.2014 21:55
Почему при перегруженных = и +, вызывается... WebbMan Общие вопросы C/C++ 18 13.12.2012 01:15
Почему вызывается деструктор? MrGukk Общие вопросы C/C++ 13 23.08.2012 17:42
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38