C++ 11:移动语义是否涉及传递值?

Bil*_*eal 8 c++ move-semantics c++11

我有一个看起来像这样的API:

void WriteDefaultFileOutput(std::wostream &str, std::wstring target)
{
    //Some code that modifies target before printing it and such...
}
Run Code Online (Sandbox Code Playgroud)

我想知道通过这样做启用移动语义是否合理:

void WriteDefaultFileOutput(std::wostream &str, std::wstring&& target)
{
    //As above
}
void WriteDefaultFileOutput(std::wostream &str, std::wstring const& target)
{
    std::wstring tmp(target);
    WriteDefaultFileOutput(str, std::move(tmp));
}
Run Code Online (Sandbox Code Playgroud)

或者这只是编译器应该能够弄清楚的样板?

fre*_*low 16

"按值传递"可以表示复制或移动; 如果参数是左值,则调用复制构造函数.如果参数是rvalue,则调用移动构造函数.您不必执行任何涉及rvalue引用的特殊操作来获取带有pass by值的移动语义.

我在什么是移动语义中深入研究这个主题

  • 这几乎不是我所说的优化(尽管它是正式的).删除复制构造函数可能会导致程序语义发生变化,这是合法的,因为标准赋予编译器明确的授权,并且因为它可能会改变语义,所以在评估程序正确性时必须考虑到这一点. (2认同)