如何使用成员函数的decltype

0 c++ function member instance decltype

我正在尝试在Visual Studio 2012中对成员函数使用decltype.我偶然发现了一个特性,我想知道这是不是意图还是编译错误.考虑(只是一个没有意义的代码片段来表明我的观点):

struct Test { int f() {return 0;} } T;
std::integral_constant<decltype(T.f()), 5>;
std::integral_constant<decltype(&Test::f), 5>; // error C2440
Run Code Online (Sandbox Code Playgroud)

当第二行编译时,第三行给出错误C2440:'specialization':无法从'int'转换为'int(__thiscall Test ::*)(void)'

为什么在函数的instanciated调用上的decltype产生它的返回类型(这是我所期待的),但是如果没有任何成员涉及尝试做同样的操作会产生成员函数指针?如果这是预期的行为,背后的原因是什么?我如何表示我正在请求成员函数的返回类型,而实际上没有实例?当然,我可以用脏的方式做到这一点:

std::integral_constant<decltype(((Test*)nullptr)->f()), 5>;
Run Code Online (Sandbox Code Playgroud)

但毫无疑问,这很漂亮,非常丑陋,应该有一种干净,直接的C++方式来表达这一点.

cpp*_*ner 5

&Test::f不会调用成员函数Test::f.相反,它获取成员函数的地址并产生指向成员函数指针,该函数是类型的int (Test::*)().

为了做你想做的事,你应该使用std::declval.正确的语法是

std::integral_constant<decltype(std::declval<Test>().f()), 5>
Run Code Online (Sandbox Code Playgroud)