今天我遇到了这个奇怪的代码:
auto rovoid_iterator
(
Construct ROII* const at,
auto(ROII&)(auto(*)(Str&&)noexcept->void) ->void //WTF??
) -> void;
这个奇怪的第二个参数到底是什么?
谢谢!
答案 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标记了游戏就绪功能。