C++ [[noreturn]]函数如何具有返回类型?
我遇到了这个“高度可读”和“优雅”代码的“漂亮”示例,但我在理解它时遇到了困难:C++ [[noreturn]]函数如何具有返回类型?,c++,function,return,noreturn,C++,Function,Return,Noreturn,我遇到了这个“高度可读”和“优雅”代码的“漂亮”示例,但我在理解它时遇到了困难: struct S { [[noreturn]] virtual inline auto f(const unsigned long int *const) –> void const noexcept; }; 以下是我的理解(如果我错了,请纠正我): f()是S virtual-可以由派生类重写 inline-编译器应该尝试为调用f生成代码,而不
struct S {
[[noreturn]] virtual inline auto f(const unsigned long int *const)
–> void const noexcept;
};
以下是我的理解(如果我错了,请纠正我):
是f()
S
-可以由派生类重写virtual
-编译器应该尝试为调用inline
生成代码,而不是正常调用它f
-该函数无法更改任何const
的成员S
-函数将永远不会抛出(不能抛出或不允许抛出)noexcept
- 参数:指向
常量无符号长整数的
指针
-后缀返回类型auto….->void
void
-它从不[[noreturn]]
返回
- 如果一个函数被声明为
,那么它永远不会返回到它的调用者;那么它怎么能有一个返回类型[[noreturn]]
?这个函数中的返回类型有什么意义void
- 例如,此代码是否使用
而不是int
编译李>void
- 这样一个函数的实际用途是什么?抛出异常
- 此函数完成执行后(在
之后),代码流将流向何处}
我对此很好奇,如果有人能解释一下,我将不胜感激!干杯这个
[[noreturn]]
是一个具有任何语义的属性。然而,它没有改变函数如何声明:C++中的所有正常函数(即,除构造函数、析构函数和转换运算符之外的所有函数)都有声明的返回类型。添加任何属性都不会更改此规则
[[noreturn]]
属性的目的可能是指示函数永远不会以正常方式返回。假设函数也被声明为noexcept
,这基本上意味着相应的函数也不能抛出异常。具有类似行为的函数的一个示例是终止程序的exit()
。我可以想象,实现某种应用程序循环的函数也可以符合条件。在任何情况下,[[noreturn]]
都会告诉系统,相应的函数将永远不会正常返回,也就是说,从函数(“after}”)上脱落可能会导致未定义的行为
如果函数被声明为[[noreturn]],它将永远不会返回到调用方;那么它怎么会有返回类型void呢?这个函数中的返回类型有什么意义
从Q&A中可以看出,noreturn是一种告诉编译器函数不返回的方法。通常这意味着它要么有一个无限循环(通常出现在假定无限期运行的服务器中),要么调用exit()
,terminate()
等,在不返回main的情况下退出应用程序。[[noreturn]]
是可选的,即您不必指定它。它是一个属性,即定义/声明函数的基本语法保持不变,因此函数必须像其他函数一样具有返回类型
例如,这段代码是用int而不是void编译的吗
是的,虽然编译器可能会警告您,从一个永远不会返回的函数返回某些内容是没有意义的
这样一个函数的实际用途是什么?抛出异常
首先想到的是一些无休止的循环,例如在服务器上处理传入的请求。抛出异常对于[[noreturn]]
函数也是可以的,但在这里它并不是一个真正的选项,因为它明确表示noexcept
。抛出将触发对std::terminate()
的调用,导致程序本身终止,但在实现定义的堆栈展开量之前,这实际上意味着[[noreturn]]]
仍然适用
此函数完成执行后(在}之后),代码流将流向何处
函数从未达到其关闭状态
}
。它要么无休止地运行(直到有人拔出插头),要么异常退出,即通过程序终止。换句话说,如果函数不再执行,它实际上没有完成,而是中止了执行,并且没有程序和控制流可供使用。其他答案很好,但我将为您提供另一个答案
如果函数被声明为[[noreturn]]
,它将永远不会返回到调用方;那么它怎么会有返回类型void呢?这个函数中的返回类型有什么意义
您可能需要返回类型(以及非void返回类型)的一个原因是,如果函数正在重写超级类方法
struct Parent {
virtual int f()=0;
}
struct Child {
[[noreturn]] override int f() noexcept { ... }
};
在某些上下文中,编译器将能够使用
[[noreturn]]
生成更好的代码。但在其他情况下,f
可能会被称为多模态,因此需要符合其父母的签名。@TemplateRex实际上它不是重复的,因为我最后问了4个问题,这些问题需要比那篇博文中回答的更多的信息。这些问题没有得到代码的充分支持,即,你尝试了什么?@TemplateRex我什么都不能尝试,因为我的编译器甚至不理解[[noreturn]]
的意思。我需要帮助,这就是我问的原因。有很多在线编译器支持它,你真的应该投入更多的精力来缩小你的问题范围,让别人能够帮助你,而第一个