提问人:Adrian 提问时间:11/13/2022 更新时间:11/13/2022 访问量:61
为什么右值字符串流在此上下文中起作用,而左值不工作?
Why is a rvalue string stream working in this context but not an lvalue?
问:
我注意到,通过执行以下操作,我可以对窄字符串到宽字符串进行一些快速而肮脏的翻译:
#include <iostream>
#include <sstream>
int main() {
using namespace std;
wcout << (wstringstream{} << "This works.\n").str();
wstringstream ss{};
wcout << (std::move(ss) << "This works too.\n").str();
return 0;
}
但是如果我用左值替换右值,它就不起作用:wstringstream
#include <iostream>
#include <sstream>
int main() {
using namespace std;
wstringstream ss{};
wcout << (ss << "This doesn't work. :(\n").str();
return 0;
}
这到底是怎么回事?
答:
1赞
phoenixinwater
11/13/2022
#1
在工作示例中,类型是 which 有一个方法,并来自运算符的右值模板:std::basic_stringstream
str()
<<
std::__cxx11::basic_stringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&& std::operator<< <std::__cxx11::basic_stringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, char [13]>(std::__cxx11::basic_stringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&&, char const (&) [13])
而在非工作中,它没有方法,并且来自继承的类运算符重载。std::basic_ostream
str()
std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& std::operator<< <wchar_t, std::char_traits<wchar_t> >(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >&, char const*)
评论
0赞
Adrian
11/13/2022
是的,我能猜到,但为什么呢?我想这是 cppinsights 中的一个错误吗?
0赞
Adrian
11/13/2022
哦,我猜这是因为类不是 a 或 a ,所以它转到免费模板。这是有道理的。operator<<
const
&&
评论
ss
调用继承的 ,并调用自由运算符模板basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb )
wstringstream{} << "This works.\n"
template< class Ostream, class T > Ostream&& operator<<( Ostream&& os, const T& value );