2013-03-10 46 views
13

Workarounds for no 'rvalue references to *this' feature,我看到下面的成员函数(转换运算符):&&在函数签名的末尾(在右括号之后)是什么意思?

template< class T > 
struct A 
{ 
    operator T&&() && // <-- What does the second '&&' mean? 
    { 
     // ... 
    } 
}; 

什么是第二对&&意思?我不熟悉那种语法。

+1

** && ref-qualifier **:所有声明'T()'有一个ref-qualifier:[** Link **](http://www.open-std.org/jtc1/sc22/wg21 /docs/papers/2007/n2439.htm) – 2013-03-10 07:41:40

回答

14

这是一个ref-value限定符。下面是一个基本的例子:

// 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 
} 

输出:从here摘自

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

10

它表明函数只能在rvalues上调用。

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 

Live Demo输出:

f() & 
f() && 

希望有所帮助。

+0

是的,我发现[* rvalue-reference to cv X',用&& ref-qualifier *声明的函数](http://www.open-std.org/jtc1/ scw/wg21/docs/papers/2007/n2439.htm)13.3.1 – 2013-03-10 07:43:53

+0

Nawaz:对我来说很好的例子:) – 2013-03-10 07:45:32

+0

请注意,根据http://stackoverflow.com/a/8610714/368896,过载是不合法的使用'f()'和'f()&&' - “你不允许在r值参考版本和非参考版本之间过载。” – 2013-03-10 07:57:57

相关问题