Меня смущает то, как компилятор и компоновщик справляются с тем фактом, что требования к вызову er функции различаются в зависимости от того, использует ли функция RVO или NRVO.
Это может быть мое недоразумение, но я предполагаю, что вообще без RVO или NRVO
std::string s = get_string();
включает построение перемещения s из результата get_string, если get_string не выполняет N?RVO, но если get_string выполняет N?RVO, вызывающий код ничего не делает, а s
создается на месте функцией get_string.
РЕДАКТИРОВАТЬ: вот как я представляю, как работает вызывающая сторона get_string, если нет N?RVO:
- вызвать get_string()
- Результат get_string теперь находится в стеке, вызывающий использует его для создания s
а теперь с РВО
- вызвать get_string()
- когда get_string выполняется, в стеке нет результата, get_string создает s, вызывающей стороне не нужно ничего делать для создания s.