189

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

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

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

4

6 回答 6

262

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

希望这是有益的。

于 2016-09-13T23:05:42.770 回答
131

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

于 2010-12-28T20:16:20.353 回答
98

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

于 2010-12-28T20:16:48.950 回答
38

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

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

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

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

于 2010-12-28T20:29:32.000 回答
6

我相信那是一个移动运算符。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] << ' ';
}

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

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

于 2014-12-23T16:43:12.857 回答
1

我相信 && 是为了移动语义。它允许某些东西将其内存放弃给其他需要它的东西,从而避免了复制的需要。

移动构造函数例如

String(String&& other) noexcept
{
//...
}
于 2021-11-04T11:34:13.543 回答