gpt4 book ai didi

c++ - Clang LLVM C++ `std::optional>` 令人惊讶的比较行为

转载 作者:太空狗 更新时间:2023-10-29 20:08:33 25 4
gpt4 key购买 nike

我有一个函数 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)

Performs comparison operations on optional objects.

1-6) Compares two optional objects, lhs and rhs. The contained values are compared (using the corresponding operator of T) only if both lhs and rhs contain values. Otherwise,

  • lhs is considered equal to rhs if, and only if, both lhs and rhs do not contain a value.

std::optional<T> 的默认构造函数构造一个不包含值的对象,所以 std::optional<int>>()std::optional<std::optional<int>>()不包含值,因此它们相等。

关于c++ - Clang LLVM C++ `std::optional<std::optional<int>>` 令人惊讶的比较行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52778866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com