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

时间:2010-12-28 20:14:11

标签: c++ stl operator-keyword memory-address

我正在阅读STL源代码,我不知道&&地址运算符应该做什么。以下是stl_vector.h的代码示例:

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

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

5 个答案:

答案 0 :(得分:93)

&&是C ++ 11中的新功能。 int&& a表示&#34; a&#34;是一个r值参考。 &&通常仅用于声明函数的参数。而采用r值表达式。如果您不知道r值是什么,简单的解释是它没有内存地址。例如。数字6,字符&#39; v&#39;都是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.
}

希望这是有益的。

答案 1 :(得分:89)

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

答案 2 :(得分:80)

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

答案 3 :(得分:29)

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

Rvalue参考是即将推出的标准中最重要的新事物之一;它们支持对象的“移动”语义,并允许完美转发函数调用。

这是一个相当复杂的话题 - 最好的介绍之一(不仅仅是粗略的)是Stephan T. Lavavej的一篇文章,"Rvalue References: C++0x Features in VC10, Part 2"

请注意,文章读起来仍然很重,但非常值得。即使它在Microsoft VC ++博客上,所有(或几乎所有)信息都适用于任何C ++ 0x编译器。

答案 4 :(得分:1)

我相信那是一个移动运营商。 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 -- How to create a move constructor