【发布时间】:2015-04-03 08:58:48
【问题描述】:
正如预期的那样,以下代码不会编译
#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;
}
将 A 类更改为
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);
}
};
使程序编译。但是,使用 std::move 返回右值通常不是一个好主意,因为它会返回悬空引用或阻止编译器进行某些优化。
所描述的案例是经验法则“不按右值返回”的少数例外之一,还是应该以不同的方式解决问题?
非常感谢!
【问题讨论】:
-
为了比较,采用 && 参数的标准流运算符将它们返回为 &。 en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2
标签: c++11 rvalue-reference this-pointer