我正在阅读STL源代码,我不知道&&地址操作符应该做什么。下面是来自stl_vector.h的代码示例:
vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
// NB: DR 675.
this->clear();
this->swap(__x);
return *this;
}
“地址的地址”有意义吗?为什么它有两个地址操作符而不是一个?
我正在阅读STL源代码,我不知道&&地址操作符应该做什么。下面是来自stl_vector.h的代码示例:
vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
// NB: DR 675.
this->clear();
this->swap(__x);
return *this;
}
“地址的地址”有意义吗?为什么它有两个地址操作符而不是一个?
当前回答
&&是c++ 11中的新功能,它表示函数接受一个RValue-Reference——也就是说,一个对即将被销毁的实参的引用。
其他回答
正如其他答案所提到的,这个上下文中的&&令牌对于c++ 0x(下一个c++标准)是新的,并且表示一个“右值引用”。
右值引用是即将到来的标准中更重要的新事物之一;它们支持对象上的“移动”语义,并允许函数调用的完美转发。
这是一个相当复杂的话题——最好的介绍之一(不仅仅是粗略的介绍)是Stephan T. Lavavej的一篇文章,“右值参考:VC10中的c++ 0x特性,第2部分”
请注意,这篇文章仍然是相当繁重的阅读,但非常值得。尽管它是在微软vc++博客上,但所有(或几乎所有)的信息都适用于任何c++ 0x编译器。
我相信这是一个移动操作符。operator=是赋值操作符,例如vector x = vector y。clear()函数调用听起来像是在删除vector的内容以防止内存泄漏。运算符返回指向新向量的指针。
这种方式,
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也有值。这就是=()操作符的魔力!
如何创建一个移动构造函数
&&是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.
}
希望这是有用的。
我相信&&是移动语义。它允许某物放弃自己的记忆给其他需要它的东西,避免复制的需要。
转移构造函数 如。
String(String&& other) noexcept
{
//...
}
这是c++ 11代码。在c++ 11中,&&记号可以用来表示“右值引用”。