【发布时间】:2014-03-21 09:32:51
【问题描述】:
考虑一个按值获取对象的函数,对其执行一些操作并返回该对象,例如:
std::string MyToUpper (std::string s)
{
std::transform(s.begin(), s.end(), s.begin(), std::toupper);
return s;
}
现在你用一个临时函数调用这个函数:
std::string Myupperstring = MyToUpper("text");
从概念上讲,不需要副本。在这种情况下,现代编译器是否能够删除所有副本?如果没有,是否只有动作?这个案例怎么样:
std::string Mylowerstring("text");
std::string Myupperstring = MyToUpper(std::move(Mylowerstring));
【问题讨论】:
-
在这种情况下,编译器不允许在返回中省略副本,AFAIK 这里也没有隐式的
move。 -
@Simple:如果类型是可移动的,则返回值被移动(因为这里是`string)。
-
与您的问题无关,但您的代码具有未定义的行为(假设它可以编译,但它可能不会)。
std::transform将使用char调用std::toupper,如果签署了普通的char(通常是这种情况),则会导致未定义的行为。 -
我检查了标准和函数参数在用作
return中的表达式时被隐式移动(以为只是自动变量),所以参数将被省略,参数将被移动,然后返回的值将被忽略。
标签: c++ gcc c++11 compiler-construction clang