2013-03-10 78 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

相關問題