这个奇怪的函数参数是什么?

时间:2019-08-13 17:33:24

标签: c++

今天我遇到了这个奇怪的代码:

auto rovoid_iterator
    (
        Construct ROII* const at,
        auto(ROII&)(auto(*)(Str&&)noexcept->void) ->void //WTF??
    ) -> void;

这个奇怪的第二个参数到底是什么?

谢谢!

2 个答案:

答案 0 :(得分:10)

好的,让我们解构这个可憎的东西。

首先,有一个内部类型:

auto(*)(Str&&) noexcept -> void

这是使用Str rvalue-reference作为参数的函数指针。这也是一个noexcept函数。

让我们打电话给S

using S = auto(*)(Str&&) noexcept -> void;

然后可以将参数的外部部分替换为:

auto(ROII&)(S) -> void

正如您在评论中所述,ROII是一个空宏。所以最后它看起来像这样:

auto(&)(S) -> void

该代码似乎是一个参数,它将引用采用S且返回void的函数。

答案 1 :(得分:4)

好吧,我问写这篇文章的开发者:

auto(ROII&)(auto(*)(Str&&)noexcept->void) ->void 

是对以函数指针作为参数的函数的引用。 该函数指针是一个指针,因为如果不需要它可以传递nullptr, 但是必须传递第一个函数,这就是为什么它是一个引用。第二个指针是指向noexcept函数的指针,并以右值引用字符串作为参数。 ROII标记了游戏就绪功能。