Re[3]: std::vector::emplace_back(...)
От: Lukkoye  
Дата: 17.07.14 21:07
Оценка:
Здравствуйте, HolyNick, Вы писали:

HN>Хотя нет — не снимается.


Потому что вопреки досужим мнениям, язык с++ является статически строго типизированным. А это означает, что он на нем нельзя выполнять семантику присвоения теплого с мягким:

some val = 10;

Что здесь происходит?

Некоторые думают, что данный код эквивалентен:

some val(10);

Но это ошибочное мнение. Поскольку язык строго типизированный, то когда используется семантика присвоение (символ '='), в левой и в правой части должны находится идентичные типы данных.

Поэтому настоящий эквивалент кода выглядит так:

some val = some(10);

Компилятор пытается создать в правой части временный объект такого же типа, и только потом использовать семантику присвоения.

Окончательная версия эквивалента получается такой:

some val( some(10) );

При этом срабатывает стандартная NRVO-оптимизация, и мы не наблюдаем вызова конструктора копии. Даже в дебаге не наблюдаем.

Вообще согласно стандарту, вы не должны закладываться на наблюдаемость копирующих конструкторов, потому что они являются претендентами на оптимизацию.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.