2015-04-03 30 views
5

olarak aşağıdaki kod, beklendiği gibi,Dönüş "Bu" rvalue

class A 
{ 

    public: 

    A() = default; 
    ~A() = default; 

    A(const A&) = delete; 
    A(A&&) = delete; 

    A& operator=(const A&) = delete; 
    A& operator=(A&&) = delete; 

    A& operator<<(const int i) & 
    { 
     std::cout << "operator<< called on lvalue" << std::endl; 
     return *this; 
    } 

    A&& operator<<(const int i) && 
    { 
     std::cout << "operator<< called on rvalue" << std::endl; 
     return std::move(*this); 
    } 


}; 

programı derleme yapar için A sınıfı değiştirme

#include <iostream> 

class A 
{ 

    public: 

    A() = default; 
    ~A() = default; 

    A(const A&) = delete; 
    A(A&&) = delete; 

    A& operator=(const A&) = delete; 
    A& operator=(A&&) = delete; 

    A& operator<<(const int i) 
    { 
     std::cout << "operator<< called" << std::endl; 
     return *this; 
    } 

}; 

void foo(A&& a) 
{ 
    std::cout << "foo called" << std::endl; 
} 

int main() 
{ 
    A a; a << 14; 
    foo(std::move(a)); // works fine 

    foo(A() << 14); // does not compile 

    return 0; 
} 

derleme değil. Ancak, std :: move ile geri dönen ritimler genellikle iyi bir fikir değildir, çünkü sarkan referansları döndürür ya da derleyicinin belirli optimizasyonları yapmasını engeller.

Belirtilen durum, "kuralsız olarak geri dönme" başlığının kuralının birkaç istisnasından biri mi, yoksa sorun farklı mı çözülmeli?

Harika teşekkürler!

+0

Benzer http://stackoverflow.com/questions/25334698/is-stdmovethis-a-good-pattern. – alfC

+0

Karşılaştırmak için, && argümanlarını alan standart akış operatörleri bunları & olarak döndürür. http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2 –

cevap

0

Bu kod, kesinlikle geçerli ve güvenlidir. senin nesne zaten kodun güvenliğini değiştirmez (hareketle) tekrar rvalue için döküm

A&& operator<<(const int i) && 

bir rvalue gibi. Bu durumda NRVO optimizasyonu gerçekleşmeyecektir, bu nedenle kodun hızının etkilenmesi olası değildir.

Yani onu formüle gibi ben de

bu kural "evet, bu kuralın bir istisnası" derdim evrensel değildir: (Bu soru soruldu neden olan) neler olduğunu anlarsanız Bunun yerine iyi niyetinize güvenebilirsiniz.

İlgili konular