Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::nullopt不是C++;标准_C++_C++17 - Fatal编程技术网

C++ 为什么std::nullopt不是C++;标准

C++ 为什么std::nullopt不是C++;标准,c++,c++17,C++,C++17,我不理解标准中包含std::nullopt\t的原因。它是严格为了方便而存在,还是在某些特殊情况下需要 要明确的是,我知道它被用作构造空std::optional对象的参数。但是考虑到std::optional的默认构造函数已经存在,似乎没有明显的动机存在std::nullopt\t。std::optional必须存在这样的构造函数和赋值运算符才能符合特定的概念吗?如果是,哪个概念?C++参考说明了一切: std::nullopt\u t是一个空类类型,用于指示具有未初始化状态的optional

我不理解标准中包含
std::nullopt\t
的原因。它是严格为了方便而存在,还是在某些特殊情况下需要


要明确的是,我知道它被用作构造空
std::optional
对象的参数。但是考虑到
std::optional
的默认构造函数已经存在,似乎没有明显的动机存在
std::nullopt\t
std::optional
必须存在这样的构造函数和赋值运算符才能符合特定的概念吗?如果是,哪个概念?

C++参考说明了一切:

std::nullopt\u t
是一个空类类型,用于指示具有未初始化状态的
optional
类型。特别是,
std::optional
有一个构造函数,该构造函数将
nullopt\t
作为一个参数,它创建一个不包含值的
optional


nullopt\t
nullopt
的类型,表示脱离
可选
状态
nullopt
允许消除重载歧义,例如(来自
可选
提案的示例):

无效运行(复杂v);
无效运行(可选v);
运行(nullopt);//选择第二个重载
运行({});//模棱两可的

这是为了阅读这本书,它应该足以消除你的任何疑虑,不是吗?为这个模糊的问题道歉。nullopt的预期用途非常清楚。我的问题围绕着存在相关std::optional构造函数和赋值运算符的实际必要性展开。看起来这主要是为了方便起见,并赋予它类似指针的行为:@NathanOliver IMO这应该是一个答案,尽管对该段中指出的情况有所注意,但它声称需要消除歧义。好:答案是。@ZarkBardoo使用
可选{}
强制重复类型名。不必重复你自己是好的。引入
自动
变量类型推断也是同样的道理。这不是必需的,但有帮助。@user2079303您是想暗示标准是干的吗?;)@ZarkBardoo的意思是,例如
auto
是“严格为了方便”。“方便”让编写bug变得更加困难。我们可以用替换整个标准,我们仍然可以编写所有相同的程序。这就不那么“方便”了。为了澄清,我并不反对这是为了方便,我只想指出,考虑这是否是为了方便的观点是没有意义的。@user207933我明白你的观点,但我认为这可能过于简单化了。例如,std::variant增加了便利性,但我可能会认为,在添加std::variant之后,需要存在类似std::monostate的类。std::optional同样增加了便利性,但它的实现不需要std::nullopt的存在,几乎不需要std::variant需要std::monostate
void run(complex<double> v);
void run(optional<string> v);

run(nullopt);              // pick the second overload
run({});                   // ambiguous