注意后来添加:经过一些实验后,我意识到我不需要为r值ostream重载,库已经为我做了。只需要具有l值版本,并且库具有一些转发到已实现的重载的r值版本。
因此,在C ++ 11中,即使没有自定义r值重载,也允许std::ofstream("file") << A{}
。
通常在C ++中,我们用这种方式定义自定义ostream operator<<
:
class A {
int impl_;
friend std::ostream& operator<<(std::ostream& os, A const& self){
return os << "A:" << self.impl_;
}
};
但是现在,在C ++ 11之后,有r值引用,事实上,内置类型可以流式传输到r值std::ostream
引用。
现在允许这样做:
int i = 5;
std::ofstream("file") << i;
(我不知道这是否是定义特殊重载的原因。)
这是否意味着为了保持一致性,应该为自定义类定义两个运算符?像这样,
class A {
int impl_;
friend std::ostream& operator<<(std::ostream& os, A const& self) {
return os << "A:" << self.impl_;
}
friend std::ostream&& operator<<(std::ostream&& os, A const& self) {
os << "A:" << self.impl_;
return std::move(os);
}
};
或更精简,
class A {
int impl_;
friend std::ostream& operator<<(std::ostream& os, A const& self) {
return os << "A:" << self.impl_;
}
friend std::ostream&& operator<<(std::ostream&& os, A const& self) {
return std::move(os << self); // calls the other overload
}
};
目前在C ++ 11中重载operator<<
的推荐方法是什么?