Допустим, у меня есть функция
#include <string>
std::string const foo()
{
std::string s = "bar";
return s;
}
int main()
{
std::string t = foo();
}
Может ли компилятор выполнить (именованную) оптимизацию возвращаемого значения для t
хотя типы s
а также t
оба отличаются от возвращаемого типа foo
из-за const
разница?
(Если ответ для C ++ 03 и C ++ 11 разный, то мне определенно интересно узнать ответ C ++ 03.)
Для оптимизации RVO нет возможности нарушить обещание const
, так что нет проблем: RVO может быть выполнен.
Тем не мение, переместить семантику зависит от const
, Это эффективно отключает семантику перемещения, то есть вызовы T(T&&)
конструктор или оператор присваивания перемещения. Так что в общем, не используйте const
на возвращаемое значение.
Скотт Мейерс изначально рекомендовал const
на возвращаемые значения, для более вменяемого кодирования.
Затем Андрей Александреску в своей статье Mojo для DDJ отметил, что впредь, с семантикой перемещения, const
о возвращаемых значениях лучше запретить, а более ранний совет Скотта игнорируется.
Теперь я никогда не удосужился изучить различные специализированные аббревиатуры RVO, такие как NRVO и так далее. И главная причина в том, что эти изменил смысл на полпути, изначально имея одно значение с некоторыми пользовательскими функциями в компиляторе g ++. Терминология здесь просто беспорядок.
Так что, если моя терминология неверна и я действительно использовал какую-то другую аббревиатуру, пожалуйста, не стесняйтесь исправлять! 🙂
Других решений пока нет …