我目前正在尝试通过此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}}无法通过引用传递。
答案 0 :(得分:7)
构造函数采用右值引用,但other
是左值(它有一个名称)。
答案 1 :(得分:0)
以下情况:
myfunct(std::string("dsdsd"));
值std::string("dsdsd")
是myfunct()
的调用范围之外的临时值。
C ++显式指定将引用绑定到const会将临时生命周期延长到引用本身的生命周期。