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

Ana*_*rki 116 c++ stl memory-address operator-keyword

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

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

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

Xin*_*Lin 140

&&是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.
}
Run Code Online (Sandbox Code Playgroud)

希望这是有益的.

  • 看起来 [Sravani S](https://www.tutorialspoint.com/answers/Sravani-S) 于 2018 年 2 月 15 日在TutorialsPoint 上公然抄袭了您的文章,[此处](https://www.tutorialspoint.com/什么是 Cplusplus 中的双地址运算符与与)。 (14认同)
  • 我刚刚发送了TutorialsPoint [此消息](https://i.stack.imgur.com/GPEYt.png)。这篇文章被他们抄袭了,[看起来像这样](https://i.stack.imgur.com/n40nr.png)。 (11认同)
  • 现在已经是 2022 年了,TutorialsPoint 仍然显示抄袭的内容。 (10认同)
  • 我希望您添加的唯一示例是std :: move的工作方式。显示使用int &amp;&amp; c = std :: move(b);`等会发生什么。 (3认同)
  • 还有另一个重载“void Push_back (const value_type&amp; val);”,它采用左值。 (2认同)
  • @GabrielStaples 现在已经 2023 年了,TutorialsPoint 仍然显示抄袭的内容。多么丢脸啊 (2认同)

asc*_*ler 98

这是C++ 11代码.在C++ 11中,&&令牌可用于表示"右值引用".

  • 真的吗?这是一个很好的解释!X 意味着 Y。但是 Y 到底意味着什么呢?哎呀!不解释了! (3认同)

Bil*_*eal 81

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


Mic*_*urr 30

正如其他答案所提到的,&&此上下文中的标记是C++ 0x(下一个C++标准)的新内容,并代表"右值引用".

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

这是一个相当复杂的主题 - 最好的介绍之一(这不仅仅是粗略的)是Stephan T. Lavavej的一篇文章,"Rvalue参考:VC10中的C++ 0x特性,第2部分"

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

  • http://thbecker.net/articles/rvalue_references/section_01.html (3认同)

yas*_*101 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] << ' ';
}
Run Code Online (Sandbox Code Playgroud)

即使我们给了向量 a 值,向量 b 也有值。这就是魔力operator=()

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

  • 我没有注意到任何这样的答案,所以我决定补充。我今天通过谷歌搜索遇到了这个问题。 (7认同)