>>
和
std::optional
?标准类不提供
std::istream& operator>>(std::istream& is, std::optional<T>& obj)
的重载,我相信使用
std::optional<int> i{};
stream >> *i;
如果
i
还没有值,
调用未定义的行为。*是的,我知道流没有什么是惯用的或自然的......
*i
是空
std::optional
的未定义行为。 你应该做的是:
auto i = [&stream] -> std::optional<int> {
int result;
if (stream >> result) return result;
else return {};
}();
除了立即调用的 lambda 表达式 (IILE),您还可以编写一个实用函数来为您执行此操作:
template <typename T>
std::optional<T> try_read(std::istream& stream) {
T result;
if (stream >> result) return result;
else return {};
}
// ...
std::optional<int> i = try_read<int>(stream);