为什么我可以在临时 std::ofstream 对象上使用 `operator<<`?
Why can I use `operator<<` on temporary std::ofstream objects?
根据 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++ 的明确答案吗?
存在通过右值引用获取流的重载:
template< class CharT, class Traits, class T >
basic_ostream< CharT, Traits >& operator<<( basic_ostream<CharT,Traits>&& os,
const T& value );
temp 作为 os
传递。来自 reference.
C++ 标准要求存在以下函数模板 (C++17 n4659 30.7.5.5 [ostream.rvalue]):
template <class charT, class traits, class T>
basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>&& os, const T& x);
效果指定为 os << x
。
请注意,同样存在提取 (>>
)。
根据 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++ 的明确答案吗?
存在通过右值引用获取流的重载:
template< class CharT, class Traits, class T >
basic_ostream< CharT, Traits >& operator<<( basic_ostream<CharT,Traits>&& os,
const T& value );
temp 作为 os
传递。来自 reference.
C++ 标准要求存在以下函数模板 (C++17 n4659 30.7.5.5 [ostream.rvalue]):
template <class charT, class traits, class T>
basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>&& os, const T& x);
效果指定为 os << x
。
请注意,同样存在提取 (>>
)。