Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++ [[noreturn]]函数如何具有返回类型?_C++_Function_Return_Noreturn - Fatal编程技术网

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
    编译
  • 这样一个函数的实际用途是什么?抛出异常
  • 此函数完成执行后(在
    }
    之后),代码流将流向何处
我无法在VS2013预览版上运行此代码,因此我猜这些功能尚未实现


我对此很好奇,如果有人能解释一下,我将不胜感激!干杯

这个
[[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]]
的意思。我需要帮助,这就是我问的原因。有很多在线编译器支持它,你真的应该投入更多的精力来缩小你的问题范围,让别人能够帮助你,而第一个