这段代码中的右值引用在哪里?
Where is the rvalue reference in this code?
我正在阅读这篇关于左值和右值的文章article,我在这部分迷路了:
class MetaData
{
public:
MetaData (int size, const std::string& name)
: _name( name )
, _size( size )
{}
// copy constructor
MetaData (const MetaData& other)
: _name( other._name )
, _size( other._size )
{}
// move constructor
MetaData (MetaData&& other)
: _name( other._name )
, _size( other._size )
{}
std::string getName () const { return _name; }
int getSize () const { return _size; }
private:
std::string _name;
int _size;
};
并且:
class ArrayWrapper
{
public:
// default constructor produces a moderately sized array
ArrayWrapper ()
: _p_vals( new int[ 64 ] )
, _metadata( 64, "ArrayWrapper" )
{}
ArrayWrapper (int n)
: _p_vals( new int[ n ] )
, _metadata( n, "ArrayWrapper" )
{}
// move constructor
ArrayWrapper (ArrayWrapper&& other)
: _p_vals( other._p_vals )
, _metadata( other._metadata )
{
other._p_vals = NULL;
}
// copy constructor
ArrayWrapper (const ArrayWrapper& other)
: _p_vals( new int[ other._metadata.getSize() ] )
, _metadata( other._metadata )
{
for ( int i = 0; i < _metadata.getSize(); ++i )
{
_p_vals[ i ] = other._p_vals[ i ];
}
}
~ArrayWrapper ()
{
delete [] _p_vals;
}
private:
int *_p_vals;
MetaData _metadata;
};
作者继续解释:
...The reason is simple: the value of other in the move constructor--it's an rvalue reference.
我想他指的是 ArrayWrapper 的移动构造函数,其中: _metadata( other._metadata )
可见。这对我来说似乎是左值,而不是右值引用。
It's an lvalue, and so the copy constructor is called, not the move constructor.
他是不是想说 _metadata( other._metadata )
结果调用了 Metadata
的复制构造函数?
有人可以帮忙吗? TIA.
other
是变量名,因此是左值表达式。从左值表达式对数据成员的成员访问再次产生左值表达式,因此 other._metadata
也是一个。
因此 _metadata(other._metadata)
将调用复制构造函数,而不是移动构造函数。
可以通过在参数表达式中调用 std::move
将左值表达式变成右值(特别是 xvalue)表达式。 std::move(other._metadata)
是一个右值表达式,调用 _metadata(std::move(other._metadata))
将更喜欢移动构造函数重载,而不是复制构造函数。
我正在阅读这篇关于左值和右值的文章article,我在这部分迷路了:
class MetaData
{
public:
MetaData (int size, const std::string& name)
: _name( name )
, _size( size )
{}
// copy constructor
MetaData (const MetaData& other)
: _name( other._name )
, _size( other._size )
{}
// move constructor
MetaData (MetaData&& other)
: _name( other._name )
, _size( other._size )
{}
std::string getName () const { return _name; }
int getSize () const { return _size; }
private:
std::string _name;
int _size;
};
并且:
class ArrayWrapper
{
public:
// default constructor produces a moderately sized array
ArrayWrapper ()
: _p_vals( new int[ 64 ] )
, _metadata( 64, "ArrayWrapper" )
{}
ArrayWrapper (int n)
: _p_vals( new int[ n ] )
, _metadata( n, "ArrayWrapper" )
{}
// move constructor
ArrayWrapper (ArrayWrapper&& other)
: _p_vals( other._p_vals )
, _metadata( other._metadata )
{
other._p_vals = NULL;
}
// copy constructor
ArrayWrapper (const ArrayWrapper& other)
: _p_vals( new int[ other._metadata.getSize() ] )
, _metadata( other._metadata )
{
for ( int i = 0; i < _metadata.getSize(); ++i )
{
_p_vals[ i ] = other._p_vals[ i ];
}
}
~ArrayWrapper ()
{
delete [] _p_vals;
}
private:
int *_p_vals;
MetaData _metadata;
};
作者继续解释:
...The reason is simple: the value of other in the move constructor--it's an rvalue reference.
我想他指的是 ArrayWrapper 的移动构造函数,其中: _metadata( other._metadata )
可见。这对我来说似乎是左值,而不是右值引用。
It's an lvalue, and so the copy constructor is called, not the move constructor.
他是不是想说 _metadata( other._metadata )
结果调用了 Metadata
的复制构造函数?
有人可以帮忙吗? TIA.
other
是变量名,因此是左值表达式。从左值表达式对数据成员的成员访问再次产生左值表达式,因此 other._metadata
也是一个。
因此 _metadata(other._metadata)
将调用复制构造函数,而不是移动构造函数。
可以通过在参数表达式中调用 std::move
将左值表达式变成右值(特别是 xvalue)表达式。 std::move(other._metadata)
是一个右值表达式,调用 _metadata(std::move(other._metadata))
将更喜欢移动构造函数重载,而不是复制构造函数。