Миш*_*сим 1 c++ pointers c++17 stdoptional
为什么我不能用nullptr而不是nullopt?为什么要{}翻译nullopt?
optional<T>它不是一种指针T,它是一个T或者什么都不是的值.你不能optional像指针和引用那样拥有"悬空"或任何其他类型的"无效"值.
nullptr 是一个可以转换为任何指针类型的值的对象.
nullopt是一个可以转换为任何optional类型的值的对象.
{}是(在期望值的上下文中)表达式,表示"类型的默认构造对象T",其中T是从上下文推断出的某种类型.如果T是指针类型,它将比较等于nullptr.如果T是一个optional类型,它将比较等于nullopt.如果T是算术类型,它将比较等于0.如果T是标准容器类型之一,它将与该类型的其他空容器进行比较.
为什么我不能用
nullptr而不是nullopt?
因为他们是不同的东西.它们意味着不同的东西,它们被用于不同的东西.
有必要使用一个独特的nullopt值,std::optional因为nullptr已经做了一些事情:
std::optional<int*> o;
o = nullptr;
assert( o.has_value() );
o = std::nullopt;
assert( !o.has_value() );
Run Code Online (Sandbox Code Playgroud)
为什么要
{}翻译nullopt?
(注意,仅std:optional当{}与其他类型一起使用时才适用.)
它之所以这样做,是因为能够说出o = {}并且拥有Do Do Thing™ 是很方便的,因此std::optional编写规范是为了使其工作.