Я не знаю всех условий, но я полагаю, что тот факт, что вы возвращаете параметр, а не экземпляр, созданный в функции, вызывает проблему в вашем примере.
Для меня следующее показало один и тот же адрес для обоих:
#include <iostream>
#include <string>
std::string foo()
{
std::string s("rvo!");
std::cout << "address: " << (void *)(&s) << std::endl;
return s;
}
int main()
{
const std::string s = foo();
std::cout << "address: " << (void *)(&s) << std::endl;
std::cout << s << std::endl;
return 0;
}
Подписаться на комментарий Дэрида
Кодовая панель для страницы документирует, что для нее используются конструкторы -fno-elide-для C ++. Документация для этой опции формирует состояние страницы руководства g ++:
Стандарт C ++ позволяет реализации исключать создание
временный, который используется только для инициализации другого объекта
того же типа. Указание этой опции отключает эту оптимизацию, и
заставляет G ++ вызывать конструктор копирования во всех случаях.
На моей машине компиляция с -fno-elide-constructors предотвращает RVO, но компиляция без позволяет.