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!
Benzer http://stackoverflow.com/questions/25334698/is-stdmovethis-a-good-pattern. – alfC
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 –