在一个函数签名的结尾(闭合括号后面),&&代表什么意思?

53
Workarounds for no 'rvalue references to *this' feature中,我看到以下成员函数(一个转换运算符):
template< class T >
struct A
{
    operator T&&() && // <-- What does the second '&&' mean?
    {
        // ...
    }
};

第二个&&是什么意思?我不熟悉这个语法。

2
&& 引用限定符: 所有声明 T() 都具有引用限定符: 链接 - Grijesh Chauhan
2个回答

50
这是一个引用值限定符。以下是一个基本示例:
// t.cpp
#include <iostream>

struct test{
  void f() &{ std::cout << "lvalue object\n"; }
  void f() &&{ std::cout << "rvalue object\n"; }
};

int main(){
  test t;
  t.f(); // lvalue
  test().f(); // rvalue
}

输出:

$ clang++ -std=c++0x -stdlib=libc++ -Wall -pedantic t.cpp
$ ./a.out
lvalue object
rvalue object

以下内容源自这里


47

这表示该函数只能在右值上调用。

struct X
{
      //can be invoked on lvalue
      void f() & { std::cout << "f() &" << std::endl; }

      //can be invoked on rvalue
      void f() && { std::cout << "f() &&" << std::endl; }
};

X x;

x.f();  //invokes the first function
        //because x is a named object, hence lvalue

X().f(); //invokes the second function 
         //because X() is an unnamed object, hence rvalue

实时演示 输出:

f() &
f() &&

希望这有所帮助。

是的,我找到了关于使用&& ref-qualifier声明的函数的对cv X的右值引用的内容,13.3.1节。 - Grijesh Chauhan
根据https://dev59.com/eWoy5IYBdhLWcg3wWss_#8610714所述,使用`f()`和`f() &&`进行重载是不合法的 -“您不能在r值引用版本和非引用版本之间进行重载”。 - Dan Nissenbaum
@DanNissenbaum:是的,我的LWS演示展示了这一点。但由于停电,我无法立即发布。现在已经更新了。 - Nawaz
谢谢。LWS是什么意思?我通过谷歌搜索找不到它 - "LWS"的结果非常少。 - Dan Nissenbaum
LWS代表www.liveworkspace.org,我在那里展示了演示文稿。 - Nawaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接