Все случаи правильные. Все они будут создавать временные объекты и применять конструктор копирования возвращаемого типа. Обязательно, если нет конструктора копирования, код не будет работать.
RVO произойдет во всех трех случаях в большинстве компиляторов. Единственная разница заключается в последнем, где стандарт не требует этого. Это потому, что у вас есть именованная переменная. Но большинство компиляторов достаточно умны, чтобы применить к ней RVO... чем позже объявлена именованная переменная и чем меньше преобразований она применяется, тем больше шансов, что RVO будет применен к именованной переменной.
Между прочим, возвращение ссылки, конечно же, возможно, как вы могли видеть в другом коде. Чего вы не должны делать, так это возвращать ссылку на локальный объект.
std::string& get_a_string2()
{
std::string str("hello");
return str; //error!
}
Как вы знаете, вызовет ошибку времени компиляции. Тем не мение,
std::string& get_a_string2(std::string& str)
{
// do something to str
return str; //OK
}
Будет работать нормально. В этом случае нет конструкции или конструкции копирования. Просто функция возвращает ссылку на свой аргумент.
person
Alexandre Bell
schedule
08.09.2009