我有一个围绕std::string
来提供格式的类:
struct Wrap {
std::string& s; // need const ref for output, non const for input
friend std::ostream& operator<< (std::ostream& os, const Wrap& w) {
os << "[" << w.s << "]";
return os;
}
friend std::istream& operator>> (std::istream& is, Wrap&& w) {
Is >> ......;
return is;
}
};
输出没问题:
my_ostream << Wrap{some_string};
因为将temp Wrap绑定到const ref是可以的。
但是输入不太好:
my_istream >> Wrap{some_string}; // doesn't compile - cannot bind lvalue to rvalue
我可能会构建它,但是由于我没有看到任何>> &&
,所以感觉不对。
>>&&
是否以某种方式被禁止或邪恶?
答案 0 :(得分:1)
(在gcc版本7.3.0(Ubuntu 7.3.0-16ubuntu3)上进行了测试)
您的代码可以按原样运行(在此处运行:http://cpp.sh/9tk5k):
#include <string>
#include <iostream>
struct Wrap {
std::string& s; // need const ref for output, non const for input
friend std::ostream& operator<< (std::ostream& os, const Wrap& w) {
os << "[" << w.s << "]";
return os;
}
friend std::istream& operator>> (std::istream& is, Wrap&& w) {
is >> w.s;
return is;
}
};
int main() {
std::string a = "abcd";
std::cin >> Wrap{a};
std::cout << Wrap{a};
}
您应该能够将Wrap作为r值传递。如果您是在线创建的,那将是正确的。
将r值与const ref结合也应该(并且确实)。
答案 1 :(得分:0)
右值引用只能绑定到右值。大多数时候,这就是您想要的-例如,它可以确保在编写move ctor / assignment运算符时,不会意外地在左值上调用它,并销毁了仍将要使用的内容。 / p>
我不确定在这种情况下为什么要使用右值引用,但是出于某些原因,您确实需要它,至少可以在模板参数中使用相同的语法:
struct Wrap
{
std::string s; // need const ref for output, non const for input
friend std::ostream &operator<<(std::ostream &os, const Wrap &w)
{
os << "[" << w.s << "]";
return os;
}
template <class T>
friend std::istream &operator>>(std::istream &is, T &&w)
{
is >> w.s;
return is;
}
};
int main() {
int x;
Wrap w;
std::cin >> w;
}
不确定那是否真的有用。