nullptr,{}和nullopt之间的区别

时间:2017-12-13 11:18:10

标签: c++ pointers c++17 stdoptional

为什么我不能使用"Provider=OraOLEDB.Oracle; Data Source = ; User ID =; Password="; 代替nullptr?为什么nullopt翻译为{}

2 个答案:

答案 0 :(得分:7)

  • Step #100 w1 = [-0.9143346] w2 = [ 1.27399015] b = [ 2.25566769] Step #200 w1 = [-0.80373073] w2 = [ 1.27550149] b = [ 2.0513134] ... 不是指向optional<T>的指针,它是一个值 无论是T还是什么都没有。你不能拥有一个&#34;悬空T&#34;或任何其他类型的&#34;无效&#34;价值,就像指针和参考资料一样。

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

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

  • optional是(在期望值的上下文中)表达式意味着&#34; a 类型为{}&#34;的默认构造对象,其中T是从上下文推断的某种类型。如果T是指针类型,则它将等于T。如果nullptrT类型,则它将等于optional。如果nullopt是算术类型,则它将等于T。如果0是标准容器类型之一,它将与该类型的其他空容器进行比较。

答案 1 :(得分:5)

  

为什么我不能使用nullptr代替nullopt

因为他们是不同的东西。它们意味着不同的东西,它们被用于不同的东西。

因为nullopt已经做了某件事,所以std::optional必须有一个不同的nullptr值才能使用{/ 1}}:

std::optional<int*> o;
o = nullptr;
assert( o.has_value() );
o = std::nullopt;
assert( !o.has_value() );
  

为什么{}翻译为nullopt

(N.B。仅适用于std:optional,而不是{}与其他类型使用时。)

这样做是因为能够说o = {}并让它做正确的事情是很方便的,所以编写std::optional的规范是为了使其有效。