C++ 为什么`operator<;的右值过载<;`对于'basic_ostream',是否返回左值引用?

C++ 为什么`operator<;的右值过载<;`对于'basic_ostream',是否返回左值引用?,c++,c++11,iostream,rvalue-reference,C++,C++11,Iostream,Rvalue Reference,§27.7.3.9为操作员定义了以下过载这是一个缺陷,是我的错,对不起。(感谢您为我找到了它!:-)是我目前对“右值流插入器”的正确修复的看法。但请注意,您仍然可能会抓住它并遇到麻烦: auto&& s = (std::stringstream() << "hi there!\n"); std::cout << s.rdbuf(); // oops auto&&s=(std::stringstream()嗯……那么……除了移动到的basic_ostrea

§27.7.3.9
操作员定义了以下过载这是一个缺陷,是我的错,对不起。(感谢您为我找到了它!:-)是我目前对“右值流插入器”的正确修复的看法。但请注意,您仍然可能会抓住它并遇到麻烦:

auto&& s = (std::stringstream() << "hi there!\n");
std::cout << s.rdbuf(); // oops

auto&&s=(std::stringstream()嗯……那么……除了移动到的
basic_ostream
之外,不返回任何引用不是更好吗?这将禁用左值引用绑定,并允许通过
auto&&
auto const&
进行适当的生命周期扩展语义,同时仍然能够像您建议的那样链接该操作符。这将更安全。但我不确定性能损失是否值得。虽然移动流相对便宜,但我不确定它是否足够便宜,可以在每个链接操作上进行。但这是一个需要更多思考的问题……我相信优化应该在这里起作用,几乎可以避免所有的移动(尽管依赖它可能不好).然而,我注意到另一个小缺点,
std::ostream
的用户定义派生类也需要是可移动的,并且可能有那些包含固定大小缓冲区的类需要O(N)时间才能“移动”再次强调,优化很可能会使这成为一个不可操作的操作,但如果它们不起作用,则更为严重。出于某种原因,我看到的所有MSVC似乎都允许将右值绑定到非常量引用,因此返回右值不会改变MSV的任何内容。
#include <sstream>
#include <iostream>

int main(){
  auto& s = (std::stringstream() << "hi there!\n");
  std::cout << s.rdbuf(); // oops
}
auto&& s = (std::stringstream() << "hi there!\n");
std::cout << s.rdbuf(); // oops