c++ - Clang LLVM C++ `std::optional>` 令人惊讶的比较行为
问题描述
我有一个函数load(std::optional<int> page)
可以加载给定页面或所有页面,如果page.empty()
. 因为加载是一项昂贵的操作,所以我缓存了最后加载的页面及其内容。为此,我使用了一个类型的成员变量,std::optional<std::optional<int>>
其值应该告诉我当前是否缓存了单个页面、所有页面或根本没有页面。
LLVM 的 libc++ 实现(随 clang 提供Apple LLVM version 10.0.0 (clang-1000.11.45.2)
)在比较 std::optional 实例时有一个令人惊讶的行为,这与它的不同boost::optional
(用 1.67 测试):
std::cout << (std::optional<int>() == std::optional<std::optional<int>>()); // prints 1
std::cout << (boost::optional<int>() == boost::optional<boost::optional<int>>()); // prints 0
哪个是正确的行为,这是 libc++ 实现中的错误吗?
解决方案
行为是正确的:
https://en.cppreference.com/w/cpp/utility/optional/operator_cmp
template< class T, class U > constexpr bool operator!=( const optional<T>& lhs, const optional<U>& rhs ); (2)
对可选对象执行比较操作。
1-6) 比较两个可选对象 lhs 和 rhs。仅当 lhs 和 rhs 都包含值时,才比较包含的值(使用 T 的相应运算符)。否则,
- 当且仅当 lhs 和 rhs 都不包含值时,才认为 lhs 等于 rhs。
的默认构造函数std::optional<T>
构造一个不包含值的对象,因此两者std::optional<int>>()
和std::optional<std::optional<int>>()
不包含值,因此它们是相等的。
推荐阅读
- html - 如何为每组内联块开始一个新行?
- node.js - nodejs mssql 事务池
- python - Python:不同的对象获得相同的ID
- html - 制作 2 列,第一列是 Bootstrap 中的跨度
- spring-boot - 在自定义错误控制器中获取异常对象
- braintree - 使用 Braintree dropin 设置默认付款方式
- ruby-on-rails - 损坏的外键约束阻止删除
- python - scipy.stats.gaussian_kde 是否应该覆盖权重?
- javascript - 元素上的 OnLoad
- asp.net-core - 我们可以在没有 Kestrel 的情况下在 linux 上托管 ASP.NET Core 应用程序吗?