C ++ 11是否保证将移动一个垂死的对象而不是复制为参数?

时间:2017-02-28 13:16:30

标签: c++ c++11 standards move-semantics language-design

#include <vector>

using namespace std;

void f(const vector<int>&) {}
void f(vector<int>&&) {}

int main()
{
    {
        vector<int> coll;

        //
        // coll is dying, so,
        // "f(coll)" will call "f(const vector<int>&)" or
        // "f(vector<int>&&)" as per C++11?
        //
        f(coll); 
    }
}

在上面的代码中,coll即将死亡;那么,f(coll)会根据C ++ 11调用f(const vector<int>&)f(vector<int>&&)吗?

1 个答案:

答案 0 :(得分:5)

如果f(coll)调用f(vector<int>&&)而不是f(const vector<int>&),那将违反标准,因为它会选择错误的函数重载。

如果呼叫的解决方案根据呼叫的位置以及使用coll呼叫后是否有任何后续语句而有所不同,那么这也会相当混乱。

特殊待遇仅限于return values

  

如果expression是左值表达式并且满足 copy elision 的条件,或者满足条件,除了表达式命名函数参数,然后重载决策以选择构造函数用于初始化返回值的用法执行两次:首先好像表达式是一个右值表达式(因此它可以选择移动构造函数或引用const的复制构造函数),如果没有合适的转换可用,则执行重载决策第二次,使用左值表达式(因此它可以选择复制构造函数来引用非const)。