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


137

我正在阅读STL源代码,我不知道&&应该使用哪个地址运算符。这是来自的代码示例stl_vector.h

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

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


2
也许这是参考的地址。
加布

1
@Gabe; 它是一个声明,因此可以使其成为对引用的引用,由于引用本身无法修改,因此没有任何意义。address-of只能在代码中使用,而不能在声明(在这种情况下为参数,否则在声明)时使用。从来没有见过这样的事情。
falstro 2010年

5
即使只有一个&,它也与address-of运算符无关,而是表示这__x是一个引用。
sepp2k 2010年

Answers:



174

&&是C ++ 11中的新增功能。int&& a表示“ a”是r值参考。&&通常仅用于声明函数的参数。而且它只需要一个r值表达式。如果您不知道什么是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.
}

希望能提供更多信息。


11
我希望您添加的唯一示例是std :: move的工作方式。显示有会发生什么int&& c = std::move( b );,等等
Zzzach ...

2
看起来Sravani S于2018年2月15日在这里针对TutorialsPoint被公然b
Gabriel Staples

3
我只是向TutorialsPoint发送了此消息。他们them窃的这篇文章看起来像这样
Gabriel Staples


34

正如其他答案所提到的,&&在这种情况下,令牌是C ++ 0x(下一个C ++标准)的新增功能,表示“右值引用”。

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

这是一个相当复杂的主题-最好的介绍之一(不仅是粗略的)是Stephan T. Lavavej的文章,“ Rvalue引用:VC10中的C ++ 0x功能,第2部分”

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


&&令牌本身并不新鲜; 它在声明中的含义是。但是你知道的。
aschepler 2010年

在这种情况下是新的。但是对于C / C ++而言,在不同的上下文中重载其令牌以具有不同的含义是非常传统的做法。
马丁·约克

1
@aschkleper-当然...逻辑和运算符甚至都没有进入我的脑海。我将更新答案。
Michael Burr 2010年

5

我相信这是一个搬家公司。operator=是赋值运算符,例如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] << ' ';
}

即使我们给向量a赋值,向量b也具有值。这是神奇的operator=()

MSDN-如何创建移动构造函数


1
在这个已有4年历史的问题中,您的答案是什么?其他答案尚未涉及该问题?
蒙面侠

5
我没有注意到这样的答案,所以我决定添加。我只是在今天通过谷歌搜索遇到了这个问题。
yash101 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.