C ++双地址运算符? (&&)

我正在阅读STL源代码,我不知道什么&&地址运营商应该做的。 这是一个来自stl_vector.h的代码示例:

 vector& operator=(vector&& __x) // <-- Note double ampersands here { // NB: DR 675. this->clear(); this->swap(__x); return *this; } 

“地址地址”是否有意义? 为什么它有两个地址运算符而不是一个?

这是C ++ 11代码。 在C ++ 11中, &&标记可以用来表示“右值引用”。

&&在C ++ 11中是新的,它表示该函数接受一个RValue-Reference–即对即将销毁的参数的引用。

正如其他答案所提到的,这个上下文中的&&标记是C ++ 0x(下一个C ++标准)的新成员,代表了“右值引用”。

右值引用是即将到来的标准中更重要的新事物之一; 他们支持对对象的“移动”语义,并允许完美的函数调用转发。

这是一个相当复杂的话题 – 最好的介绍之一(这不仅仅是粗略的)是Stephan T. Lavavej的一篇文章, “Rvalue References:VC ++中的C ++ 0x特性,第2部分”

请注意,文章阅读还是挺重的,但是非常值得。 即使它在Microsoft VC ++ Blog上,所有(或几乎所有)信息也适用于任何C ++ 0x编译器。

&&在C ++ 11中是新的。 int&& a表示“a”是一个r值引用。 &&通常只用于声明一个函数的参数。 它只需要一个r值expression式。 如果你不知道什么是r值,简单的解释就是它没有内存地址。 例如数字6和字符'v'都是r值。 int a ,a是一个l值,然而(a+2)是一个r值。 例如:

 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. } 

希望这是信息。

我相信这是一个移动运营商。 operator=是赋值运算符,例如vector x = vector yclear()函数的调用听起来像是删除向量的内容以防止内存泄漏。 运算符返回一个指向新的向量的指针。

这条路,

 std::vector<int> a(100, 10); std::vector<int> b = a; for(unsigned int i = 0; i < b.size(); i++) { std::cout << b[i] << ' '; } 

即使我们给了向量一个值,向量b也有这个值。 这是operator=()的魔力!

MSDN – 如何创build一个移动构造函数