Почему легально перемещать константный объект?
От: wayfaring  
Дата: 09.02.14 14:05
Оценка: -1
Здравствуйте.

Почему легально перемещать константный объект?

class Test {
public:
    Test( const std::list< std::string > & values )
        :    m_values( std::move( values ) )
    {}

private:
    std::list< std::string > m_values;
};
Re: Почему легально перемещать константный объект?
От: niXman Ниоткуда https://github.com/niXman
Дата: 09.02.14 14:33
Оценка:
наверное потому, что данные объекта не изменяются?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Почему легально перемещать константный объект?
От: Abyx Россия  
Дата: 09.02.14 14:33
Оценка:
Здравствуйте, wayfaring, Вы писали:

W>Здравствуйте.


W>Почему легально перемещать константный объект?


W>
W>class Test {
W>public:
W>    Test( const std::list< std::string > & values )
W>        :    m_values( std::move( values ) )
W>    {}

W>private:
W>    std::list< std::string > m_values;
W>};
W>


rtfm, std::move ничего не перемещает.
In Zen We Trust
Re: Почему легально перемещать константный объект?
От: antropolog  
Дата: 09.02.14 14:49
Оценка: -1
Здравствуйте, wayfaring, Вы писали:

а то что можно вызывать delete для указателя на константный объект — не смущает?
константность объекта призвана обеспечить лишь неизменность инварианта, поддерживаемого классом ( и для тех кто в тренде — "потокобезопасность" объекта ), о времени жизни и владении объектом здесь речь не идёт.
Re[2]: Почему легально перемещать константный объект?
От: wayfaring  
Дата: 09.02.14 15:30
Оценка:
Здравствуйте, niXman, Вы писали:

X>наверное потому, что данные объекта не изменяются?


Все, я разобрался. В этом коде вызывался std::list( const T & ) конструктор и происходило копирование, а не перемещение...

Странно, но не так давно я дебажил этот код, и у меня вызывался std::list( T && ). Мистика какая-то...

Переместить константный список нельзя, короче...
Re[2]: Почему легально перемещать константный объект?
От: k55 Ниоткуда  
Дата: 10.02.14 13:45
Оценка:
Здравствуйте, Abyx, Вы писали:

A>rtfm, std::move ничего не перемещает.

Но для m_values вызовится конструктор перемещения (если такой существует).
В данном случае m_values это std::list у которого нет конструктора перемещения с "const &&" в итоге вызывается простой конструктор копирования.
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Re[2]: Почему легально перемещать константный объект?
От: TarasB  
Дата: 12.02.14 08:52
Оценка: -3
Здравствуйте, Abyx, Вы писали:

A>rtfm, std::move ничего не перемещает.


Какой понятный интерфейс у этого вашего СТЛ :3
Re[2]: Почему легально перемещать константный объект?
От: k55 Ниоткуда  
Дата: 12.02.14 09:42
Оценка:
Здравствуйте, antropolog, Вы писали:

A>Здравствуйте, wayfaring, Вы писали:


A>а то что можно вызывать delete для указателя на константный объект — не смущает?

А также вызвать конструктор константного объекта.
Только тут конструктор вызывается для другого объекта.

A>константность объекта призвана обеспечить лишь неизменность инварианта, поддерживаемого классом ( и для тех кто в тренде — "потокобезопасность" объекта ), о времени жизни и владении объектом здесь речь не идёт.

Вы правы. НО! Я даже отвечу вашей фразой: "о времени жизни и владении объектом здесь (в примере топикстартера) речь не идёт"
В случае конструктора перемещения инвариантность неконстантного входного объекта зачастую вкорне меняется а-ля "Было ваше, стало наше".

Страуструп так и написал, "Я не вижу смысла на кой может понадобиться конструктор перемещения от константной ссылки (возможно безумие?), но язык позволяет это делать." (Перевод мой вольный и не точный, призванный донести основную идею)
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Re[3]: Почему легально перемещать константный объект?
От: Hayabusa Россия  
Дата: 12.02.14 14:42
Оценка:
Здравствуйте, TarasB, Вы писали:

TB>Какой понятный интерфейс у этого вашего СТЛ :3


А у вас в турции свой что ли стл? )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.