该语句被解析为
return (static_cast<Hasher &>(*this))(key);
因此,static_cast
的参数是 *this
。然后将强制类型转换的结果,称为 x
,用作后缀表达式,在函数调用中使用 key
作为参数,即 x(key)
,其结果被返回。
我无法确定
*this
还是key
被传递给static_cast
如果不确定,您可以查找语法。
在非正式文档中,static_cast
的唯一可用语法是:
static_cast < new-type > ( expression )
在任何你比较的标准草案中都是如此。
因此,不存在static_cast<T>(X)(Y)
语法,唯一可能的解释是:
new-type = Hasher&
expression = *this
整个语句相当于
Hasher& __tmp = static_cast<Hasher &>(*this);
return __tmp(key);
Hasher
继承了一个函数调用运算符,并且它想要显式地调用那个explicitly - 也就是说,Hasher::operator()
而不是任何其他继承的operator()
。您会注意到相同的机制被用于显式调用其他私有继承的函数调用运算符。Equal
参数使用std::equal_to
。Hasher
,Equal
等,则可能更易读,但选择这种方式是为了允许无状态策略的empty base-class optimization。(*static_cast<Hasher*>(this))();
)。使用引用转换的事实指向更通用的显式可转换性情况。 - Red.Wave
Hasher
类有一个重载的"函数调用运算符",可以像函数一样使用。 - molbdnilostatic_cast
。(那里的答案解释了为什么使用空括号 (),而这是static_cast<>()
的事实解释了为什么第一个括号不为空。)但在两种情况下,都会调用所得到的对象的operator( something )
。 - Peter Cordes