【发布时间】:2019-09-10 09:21:50
【问题描述】:
根据 C++ 标准,您不能将临时对象绑定到非常量引用。由于流输出操作符被定义为
template <class CharT, class Traits, class Allocator>
std::basic_ostream<CharT, Traits>&
operator<<(std::basic_ostream<CharT, Traits>& os,
const std::basic_string<CharT, Traits, Allocator>& str);
我希望它不能在临时流对象上调用。但是,我尝试了以下并得到了意想不到的结果
#include <fstream>
std::ostream& print(std::ostream &stream) {
stream << "test\n";
return stream;
}
int main() {
std::fstream("") << "test\n";
// print(std::fstream("")); // Doesn't compile, as expected
}
这在 GCC 主干、Clang 主干和 MSVC 19 上编译。我什至在前两个上尝试了-pedantic-errors。虽然技术上可能这三个都错了,但我很可能误解了一些东西。
有人可以在标准中找到关于这是否是合法的 C++ 的明确答案吗?
【问题讨论】:
标签: c++ pass-by-reference temporary-objects