我正在阅读STL源代码,但不知道&&
地址运算符应该做什么。这里是来自stl_vector.h
的一个代码示例:
vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
// NB: DR 675.
this->clear();
this->swap(__x);
return *this;
}
“地址的地址”有意义吗?为什么它需要两个地址运算符而不是一个?
我正在阅读STL源代码,但不知道&&
地址运算符应该做什么。这里是来自stl_vector.h
的一个代码示例:
vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
// NB: DR 675.
this->clear();
this->swap(__x);
return *this;
}
“地址的地址”有意义吗?为什么它需要两个地址运算符而不是一个?
&&
是C++11新增的特性。 int&& a
表示"a"是一个右值引用。 &&
通常只用于声明函数的参数,并且它仅仅接受一个右值表达式。如果您不知道右值是什么,简单来说就是它没有内存地址。例如数字6和字符'v'都是右值。int a
中,a是左值,但是(a+2)
是右值。例如:
void foo(int&& a)
{
//Some magical code...
}
int main()
{
int b;
foo(b); //Error. An rValue reference cannot be pointed to a lValue.
foo(5); //Compiles with no error.
foo(b+3); //Compiles with no error.
int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
int&& d = 5; //Compiles with no error.
}
希望这很有信息量。
int&& c = std::move( b );
的情况下会发生什么。 - AlwaysTalkingAboutMyDogvoid push_back (const value_type& val);
接受左值。 - Lexseal Lin这是关于 C++11 的代码。在 C++11 中,&&
这个标记可以用来表示 "右值引用"。
正如其他答案所提到的,在这个上下文中,&&
符号是C++0x(下一个C++标准)中新增的一个表示“右值引用”的符号。
右值引用是即将发布的标准中比较重要的新特性之一;它们使得对象支持“移动”语义,并允许完美转发函数调用。
这是一个相当复杂的主题——其中一个最好的入门文章(不仅仅是概述)是由Stephan T. Lavavej撰写的一篇文章,"Rvalue References: C++0x Features in VC10, Part 2"
请注意,这篇文章还是相当深度的阅读材料,但非常值得阅读。虽然它是在Microsoft VC++博客上发布的,但所有(或几乎所有)信息都适用于任何C++0x编译器。
&&
符号本身并不是新的;它在声明中的含义是新的。但你已经知道了。 - aschepleroperator=
是赋值操作符,例如vector x = vector y
。调用clear()
函数听起来像是删除向量中的内容以防止内存泄漏。该操作符返回指向新向量的指针。
这样,
std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
std::cout << b[i] << ' ';
}
我相信 && 是用于移动语义的。它允许某个对象将其内存释放给其他需要它的对象,避免了复制的必要。
移动构造函数 例如:
String(String&& other) noexcept
{
//...
}
&
,它也与取地址运算符无关,而是表示__x
是一个引用。 - sepp2k