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

问题描述 投票:0回答:6

我正在阅读STL源代码,但我不知道

&&
地址运算符应该做什么。这是来自
stl_vector.h
的代码示例:

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

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

c++ stl operator-keyword memory-address
6个回答
339
投票

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

希望能提供有用的信息。


138
投票
C++11

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

    


111
投票
&&

是 C++11 中的新功能,它表示该函数接受

RValue-Reference
—— 即对即将被销毁的参数的引用。


42
投票
&&

标记对于 C++0x(下一个 C++ 标准)来说是新的,代表“右值引用”。

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

这是一个相当复杂的主题 - 最好的介绍之一(不仅仅是粗略)是 Stephan T. Lavavej 的一篇文章,

“Rvalue 参考:VC10 中的 C++0x 功能,第 2 部分”

请注意,这篇文章的阅读量仍然很大,但非常值得。尽管它位于 Microsoft VC++ 博客上,但所有(或几乎所有)信息都适用于任何 C++0x 编译器。


6
投票
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 -- 如何创建移动构造函数


3
投票
移动语义

。它允许某些东西将其内存交给其他需要它的东西,从而避免复制的需要。 移动构造函数 例如

String(String&& other) noexcept { //... }

20/02/24:
我觉得 && 问题与移动构造函数相关,并且缺少对左值、右值、移动语义和 std::move 的解释。

我添加了来自 Cherno 的一段不错的视频,它比 StackOverflow 评论更好地解释了 && 。

https://www.youtube.com/watch?v=fbYknr-HPYE

© www.soinside.com 2019 - 2024. All rights reserved.