我如何知道rv被移动而不是被复制?

use*_*124 0 c++

std::string my_func(){
  return std::string("...");
}
Run Code Online (Sandbox Code Playgroud)

std::string可以替换为std::vector或其他任何东西.一般来说,我怎么知道rv被移动而不是被复制?

Jos*_*son 5

根据cppreference,

在C++ 11中,没有标识且可以移动的表达式称为prvalue("纯rvalue")表达式.

像您返回的临时对象(std::string("..."))没有标识,可以移动,因为编译器可以检测到其状态在其生命周期结束之前不会被使用.因此,编译器更愿意将对象移动复制它.

但是,临时对象可能根本不会被移动或复制,因为返回值优化(RVO)是一种复制省略优化形式,它构建存储中的对象,否则将被移动到该对象中.因此,如果您要编写std::string str = my_func();代码,代码可能会被优化为str"..."就地构造,而不是在内部构造一个字符串my_func()然后将其移出.RVO适用于任何可复制和/或可移动的对象.