[[noreturn]]函数如何具有返回类型?

Ole*_*siy 9 c++ return function noreturn

我遇到了"高度可读"和"优雅"代码的"漂亮"示例,但我遇到了麻烦:

struct S {

    [[noreturn]] virtual inline auto f(const unsigned long int *const)
                         –> void const noexcept;
};
Run Code Online (Sandbox Code Playgroud)

这是我的理解(如果我错了,请纠正我):

  • f() 是...的成员函数 S
  • virtual - 可以被派生类覆盖
  • inline- 编译器应该尝试为调用生成代码f而不是正常调用它
  • const- 该功能无法更改任何S成员
  • noexcept - 该函数永远不会抛出(不能扔或不允许抛出)
  • parameter:const指向a的指针const unsigned long int
  • auto .... -> void - 后缀返回类型 void
  • [[noreturn]]-它从来没有returnŠ

以下是我的主要关注点:

  • 如果一个函数被声明为[[noreturn]],它永远不会返回给它的调用者; 那它怎么会有一个返回类型void?无论如何,这个函数的返回类型有什么意义?
  • 这段代码是否会编译int而不是void例如?
  • 这样的功能有什么用处?要抛出异常?
  • 在此函数完成执行(之后})后,代码的流程在哪里?

我无法在VS2013预览版上运行此代码,所以我猜这些功能尚未实现.

我对此非常好奇,所以如果有人能解释我会很感激!干杯

Die*_*ühl 19

[[noreturn]]是一个具有任何语义的属性.但是,它不会改变声明函数的方式:C++中的所有常规函数(即除构造函数,析构函数和转换运算符之外的所有函数)都具有声明的返回类型.添加任何属性不会更改此规则.

[[noreturn]]属性的目的可能是表明函数永远不会以正常方式返回.鉴于该函数也被声明为noexcept它基本上意味着相应的函数也不能抛出异常.具有类似行为的函数的一个示例是exit()终止程序.我可以想象实现某种应用程序循环的函数也可以符合条件.在任何情况下,[[noreturn]]告诉系统相应的函数永远不会正常返回,即,从函数中掉落("after}")可能会导致未定义的行为.


Arn*_*rtz 6

如果函数声明为[[noreturn]],它永远不会返回其调用者; 那怎么会有一个返回类型无效?无论如何,这个函数的返回类型有什么意义?

这个 Q&A中你可以看到noreturn是一种告诉编译器函数不返回的方法.通常,这意味着它或者具有一个无限循环(通常见于,都应该无限期运行的服务器)或它调用exit(),terminate()和类似物,而不返回到主退出应用程序.
[[noreturn]]是可选的,也就是说,你没有拥有指定它.它是一个属性,即定义/声明函数的基本语法保持不变,因此函数必须具有与任何其他函数一样的返回类型.

这个代码是用int而不是void编译的吗?

是的,它会,虽然编译器可能会警告你,从一个永不返回的函数返回的东西是没有意义的.

这样的功能有什么用处?要抛出异常?

首先想到的是一些无限循环,例如在服务器上处理传入的请求.抛出一个异常对于[[noreturn]]函数来说也是可以的,但它不是一个真正的选项,因为它明确地说noexcept.投掷将触发调用std::terminate(),导致程序终止本身但主要是实现定义的堆栈展开量,实际上意味着[[noreturn]]仍然适用.

在此函数完成执行后(在}之后)代码的流程在哪里?

该功能永远不会结束}.它要么无休止地运行(直到有人拔出插头),要么异常退出,即通过程序终止.换句话说,如果函数不再执行,它还没有真正完成但是执行中止,并且没有程序也没有控制流可用.