为什么我不能使用"Provider=OraOLEDB.Oracle; Data Source = ; User ID =; Password=";
代替nullptr
?为什么nullopt
翻译为{}
?
答案 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
。如果nullptr
是T
类型,则它将等于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
的规范是为了使其有效。