Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++ 若控制到达身体的末端并返回nullopt,那个么什么会中断呢?_C++_C++17 - Fatal编程技术网

C++ 若控制到达身体的末端并返回nullopt,那个么什么会中断呢?

C++ 若控制到达身体的末端并返回nullopt,那个么什么会中断呢?,c++,c++17,C++,C++17,C++14为我们提供了自动返回类型推断,C++17有一个可选的类型模板(或者类型构造函数,如果您愿意的话)。现在,的确,可选存在于标准库中,而不是语言本身,但是-为什么不在控件到达主体末尾时将其用作非void函数的返回值呢?我认为: optional<int> foo(int x) { if (x > 0) return 2 * x; } 可选foo(int x) { 如果(x>0)返回2*x; } 对于分部函数,应该是完全有效且可编译的语法,返回可选的 现在,我知

C++14为我们提供了自动返回类型推断,C++17有一个
可选的
类型模板(或者类型构造函数,如果您愿意的话)。现在,的确,
可选
存在于标准库中,而不是语言本身,但是-为什么不在控件到达主体末尾时将其用作非void函数的返回值呢?我认为:

optional<int> foo(int x)
{
    if (x > 0) return 2 * x;
}
可选foo(int x)
{
如果(x>0)返回2*x;
}
对于分部函数,应该是完全有效且可编译的语法,返回
可选的

现在,我知道这是一个有点疯狂的想法。我的问题不是你是否喜欢它,而是——假设委员会的每个人都因为某种奇怪的原因喜欢它。它会与什么发生冲突


注意:当然,如果指定一个非可选的返回值,这将不起作用,但这不算作中断。

想想以
abort()结尾的函数
或具有相同效果的自定义函数。如果编译器不能静态地证明函数永远不会达到关闭<代码> } /Cuth>,这将迫使编译器生成死代码,因此与C++的一个原则相冲突,即零开销原则:不使用的,不支付的。

< P> >以“代码→中止”()结尾的函数;
或具有相同效果的自定义函数。如果编译器不能静态地证明函数永远不会达到关闭<代码> } /COD>,这将迫使编译器生成死代码,因此与C++的一个原则相冲突,即零开销原则:不使用的,不支付。

到目前为止,它是完全未定义的行为。这意味着没有有效的现有代码包含此构造。因此,添加定义良好的行为不会破坏任何有效代码。至于被破坏的代码,如果你的提议被接受,它可能会被破坏,也可能不会被破坏,但这几乎从来都不是WG21关注的问题

主要关注的是它将如何与其他语言功能交互。我看不出与
constexpr
有冲突;如果从
constexpr
函数的末尾掉下来,则会得到一个空的
constexpr-optional
[[noreturn]]
属性显然毫无意义。
[[nodiscard]]
属性影响调用者,而不是实现。例外情况也不受影响。因此,总的来说,这项建议似乎是独立的


在WG21的提案中,建议一个不太激进的替代方案可能是值得的:简单地
返回
返回可选{}的有效替代项

到目前为止,它是完全未定义的行为。这意味着没有有效的现有代码包含此构造。因此,添加定义良好的行为不会破坏任何有效代码。至于被破坏的代码,如果你的提议被接受,它可能会被破坏,也可能不会被破坏,但这几乎从来都不是WG21关注的问题

主要关注的是它将如何与其他语言功能交互。我看不出与
constexpr
有冲突;如果从
constexpr
函数的末尾掉下来,则会得到一个空的
constexpr-optional
[[noreturn]]
属性显然毫无意义。
[[nodiscard]]
属性影响调用者,而不是实现。例外情况也不受影响。因此,总的来说,这项建议似乎是独立的


在WG21的提案中,建议一个不太激进的替代方案可能是值得的:简单地
返回
返回可选{}的有效替代项

特殊外壳
std::可选
在这里很荒谬。用户应该能够编写自己的一级等价于
std::optional

这意味着从函数的末尾掉下来需要使用某种魔法来计算隐式返回值应该是什么

最简单的魔法是从末尾掉下来相当于
return{}
对于
可选
,这是
nullopt
。如果我正确阅读了我的standardese,对于
int
,这是
0
,这与从-
main
末尾脱落的行为相匹配

这是有缺点的。首先,假设您有一个函数:

int foo(bool condition) {
  if (condition) return 7;
  custom_abort(); // does not return, but not marked up with `[[noreturn]]`
}
这将导致编译器编写
返回{}
自定义_abort()之后如果编译器无法证明
中止
不会返回。这是有代价的(至少是二进制大小)。目前,编译器可以在
abort()
之后自由排除从
foo
返回所需的任何工作,并假设
abort()
不会返回

确实,没有任何有效的程序会因此更改而表现出不同的行为,但以前未定义的行为会被定义,这可能会带来成本

我们可以用稍微不同的方式来处理这个问题:

int foo(bool condition) {
  if (condition) return 7;
  custom_abort();
  this cannot be reached;
}
< >我们在C++中添加了一个显式的“这个位置”,

添加后,我们可以对不返回的代码路径发出警告,并在稍后的标准中强制执行规则,即所有代码路径必须声明它们无法访问,或者必须返回


在这种语言转换之后,有一两个标准周期,然后隐式
return{}将是无害的,除了跳过返回不能发生标准化阶段的人。

特殊外壳
std::optional
在这里是荒谬的。用户应该能够编写自己的一级等价于
std::optional

这意味着从函数的末尾掉下来需要使用某种魔法来计算隐式返回值应该是什么

最简单的魔法是从末尾掉下来相当于
return{}
可选的情况下,这是
nu