[英]Why do compilers now accept to call str() member on a returned std::ostream& from std::stringstream::operator<<()?
考虑以下行:
std::string s = (std::stringstream() << "foo").str();
这不应该编译,因为std::stringstream::operator<<()
被std::ostream
继承并返回一个没有str()
成员的std::ostream&
。
似乎主要的编译器现在接受了过去不接受的代码。 我想了解为了编译而发生了什么标准变化?
我用gcc 、 clang和msvc做了一些测试,我可以找到发生变化的版本:
编译器 | 拒绝直到(版本) | 接受来自(版本) |
---|---|---|
GCC | 11.1 | 11.2 |
Clang | 12.0.1 | 13.0.0 |
MSVC | v19.14 | v19.15 |
你可以在这里找到测试
他们都添加了右值重载(见这里)很晚。
右值重载在 C++11 中引入,并返回相同类型的 stream 作为其左操作数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.