nullptr,{}和nullopt之间的区别

Миш*_*сим 1 c++ pointers c++17 stdoptional

为什么我不能用nullptr而不是nullopt?为什么要{}翻译nullopt

Cal*_*eth 7

  • optional<T>它不是一种指针T,它是一个T或者什么都不是的值.你不能optional像指针和引用那样拥有"悬空"或任何其他类型的"无效"值.

  • nullptr 是一个可以转换为任何指针类型的值的对象.

  • nullopt是一个可以转换为任何optional类型的值的对象.

  • {}是(在期望值的上下文中)表达式,表示"类型的默认构造对象T",其中T是从上下文推断出的某种类型.如果T是指针类型,它将比较等于nullptr.如果T是一个optional类型,它将比较等于nullopt.如果T是算术类型,它将比较等于0.如果T是标准容器类型之一,它将与该类型的其他空容器进行比较.


Jon*_*ely 5

为什么我不能用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编写规范是为了使其工作.