传递临时作为参考

时间:2015-03-31 19:03:38

标签: c++ c++11

我目前正在尝试通过此post了解复制和交换习惯用法。发布的答案中包含以下代码

class dumb_array
{
public:
    // ...

    friend void swap(dumb_array& first, dumb_array& second) // nothrow
    {
        // enable ADL (not necessary in our case, but good practice)
        using std::swap; 

        // by swapping the members of two classes,
        // the two classes are effectively swapped
        swap(first.mSize, second.mSize); 
        swap(first.mArray, second.mArray);
    }

    // move constructor
    dumb_array(dumb_array&& other)
        : dumb_array() // initialize via default constructor, C++11 only
    {
        swap(*this, other); //<------Question about this statement
    }

    // ...
};

我注意到作者使用了这个陈述

swap(*this, other);

other是临时或rvalue,它作为方法交换的引用传递。我不确定我们是否可以通过引用传递右值。 为了测试这个,我尝试这样做,但是在将参数转换为const reference

之后,以下操作无效
void myfunct(std::string& f)
{
    std::cout << "Hello";
}

int main() 
{
   myfunct(std::string("dsdsd"));
}

我的问题是other如何swap(*this, other);暂时通过引用传递myfunct(std::string("dsdsd"));而{{1}}无法通过引用传递。

2 个答案:

答案 0 :(得分:7)

构造函数采用右值引用,但other是左值(它有一个名称)。

答案 1 :(得分:0)

以下情况:

myfunct(std::string("dsdsd"));

std::string("dsdsd")myfunct()的调用范围之外的临时值。

C ++显式指定将引用绑定到const会将临时生命周期延长到引用本身的生命周期。