为什么右值字符串流在此上下文中起作用,而左值不工作?

Why is a rvalue string stream working in this context but not an lvalue?

提问人:Adrian 提问时间:11/13/2022 更新时间:11/13/2022 访问量:61

问:

我注意到,通过执行以下操作,我可以对窄字符串到宽字符串进行一些快速而肮脏的翻译:

#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;
}

这到底是怎么回事?

C++ 字符串 std

评论

0赞 Artyer 11/13/2022
相关新闻: stackoverflow.com/q/12519829/5754656 and LWG1203
0赞 273K 11/13/2022
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 );

答:

1赞 phoenixinwater 11/13/2022 #1

在工作示例中,类型是 which 有一个方法,并来自运算符的右值模板:std::basic_stringstreamstr()<<

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_ostreamstr()

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&&