2013-03-10 13 views
13

W Workarounds for no 'rvalue references to *this' feature, widzę następujących funkcji członka (operator konwersji):Co oznacza && pod koniec podpisu funkcji (po nawiasie zamykającym)?

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

Co druga para && oznacza? Nie znam tej składni.

+1

** && ref-qualifier **: wszystkie deklaracje 'T()' mają kwalifikator odwołania: [** Link **] (http://www.open-std.org/jtc1/sc22/wg21 /docs/papers/2007/n2439.htm) –

Odpowiedz

14

To jest kwalifikator wartości odniesienia. Oto prosty przykład:

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

wyjściowa:

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

Zrobione z here.

10

Wskazuje, że funkcję można wywoływać tylko na wartościach r.

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 wyjściowa:

f() & 
f() && 

nadzieję, że pomoże.

+0

Tak, znalazłem [* rvalue-odniesienie do cv X "dla funkcji zadeklarowanych przy pomocy && ref-qualifier *] (http://www.open-std.org/jtc1/ sc22/wg21/docs/papers/2007/n2439.htm) 13.3.1 –

+0

Nawaz: świetny przykład dla mnie :) –

+0

Należy pamiętać, że zgodnie z http://stackoverflow.com/a/8610714/368896, nie jest prawnie do przeciążenia za pomocą 'f()' i 'f() &&' - "nie można przeciążać między wersjami referencyjnymi wartości r a wersjami bez odwołań". –

Powiązane problemy