【发布时间】:2013-01-29 18:07:24
【问题描述】:
据我了解 C++11 引用,我不应该将右值引用绑定到(非常量)左值引用,因为前者可能绑定到临时变量,而后者绝不能绑定到临时的。
但是我发现这种奇怪的行为与临时流对象结合使用(我尽可能减少)
struct Dummy {};
template <typename Stream>
Stream& operator<<(Stream& s, Dummy) {
return s << "."; // <- (A)
}
template <typename Stream>
void pass(Stream&& s) {
std::move(s) << Dummy(); // <- (X) rvalue->lvalue conversion?
}
#include <fstream>
int main() {
pass(std::fstream("test",std::ios::out));
}
如果我在(X) 行中写s << Dummy(),C++ 会在(A) 行中抱怨,说
error: invalid initialization of reference of type ‘std::basic_fstream<char>&’ from expression of type ‘std::basic_ostream<char>’
但是,为什么代码(如上所示)编译并按预期工作? std::move 返回的右值引用应该与表达式s 一样无法绑定到左值引用,但gcc 4.6.1 和gcc 4.7.2 的反应相同。
为什么这种现象似乎只适用于流?当直接将Dummy&& 传递给期望T& 的函数时,无论有无std::move 都会失败。
【问题讨论】:
标签: c++ c++11 iostream move-semantics rvalue-reference