[[noreturn]]函数指针

9

当我使用clang (版本3.4 (trunk 194574))编译以下内容时:

typedef void (* FunctionThatNeverReturns [[ noreturn ]])();

我收到了这个内容:
error: 'noreturn' attribute only applies to functions and methods

这让我感到惊讶,因为它在旧版本的clang中完美运行。

那么,我该如何定义指向[[noreturn]]函数的指针?

我需要这样做是因为我正在一个[[noreturn]]函数中调用函数指针,如果函数指针没有标记为noreturn,则会产生警告。

哦,这个也可以:

typedef void (* FunctionThatNeverReturns [[ gnu::noreturn ]])();

但是是否没有独立于编译器的解决方案呢?


4
你不能这样做?属性不属于类型的一部分。 - R. Martinho Fernandes
@R.MartinhoFernandes 所以它曾经因为clang中的一个错误而工作? - main--
我不明白“可以被忽略”怎么就意味着“没有语义”。它只是表示附加的语义是可选的,而不是强制性的。例如,明确允许在牺牲浮点精度的情况下进行额外的优化。或者请求在硬件加速器上运行特定函数。 - Ben Voigt
好的,我应该表述得更清楚。他们可以像往常一样更改抽象机器之外的语义。这种优化已经允许在没有属性的情况下进行。然而,按照预期在此处创建不同的类型将会偏离抽象机器的语义。 - R. Martinho Fernandes
如果我看起来很讨厌,那我很抱歉,但我想出了一个更清晰表达我的意思的例子:http://ideone.com/TXfvk1。请注意,这与隐式转换或任何类似的事情无关。这两种类型实际上是一模一样的。C++没有一种方式可以表示“接受int并永远不返回”的函数类型。有一种方法可以表示接受int并永远不返回的函数,但它的类型与“接受int”的函数类型相同。 - R. Martinho Fernandes
显示剩余5条评论
3个回答

0

这个版本似乎按预期编译:

[[noreturn]] void AFunctionThatDoesNotReturn() {}
using FunctionThatNeverReturns = std::add_pointer_t<decltype(AFunctionThatDoesNotReturn)>;

但是编译器在验证时失败了,实际上我们将一个非返回函数指针分配给了该指针: https://ideone.com/YAo73S


0

试试这个

typedef void (* FunctionThatNeverReturns)() [[ noreturn ]];

在您的原始代码中,指示符被放置在指针上而不是指向的对象上。但是noreturn指针根本没有意义,您正在尝试将指针typedef为一个noreturn函数的指针。
演示:http://ideone.com/9mBR9x

3
就此而言,clang拒绝了这段代码,并声称[[noreturn]]不能应用于类型。 - R. Martinho Fernandes
@R.MartinhoFernandes:是的,g++似乎知道有问题,但它从来不告诉你具体是什么。 - Ben Voigt

0

正如注释中所指出的,这显然是标准禁止的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接