我正在尝试在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
第二行编译时,第三行给出错误C2440:'specialization':无法从'int'转换为'int(__thiscall Test :: *)(void)'
如何对函数的instanciated调用中的decltype产生其返回类型(这是我所期待的),但是如果没有任何成员涉及尝试执行相同操作会产生成员函数指针吗?如果这是预期的行为,背后的原因是什么?我如何表示我正在请求成员函数的返回类型,而实际上没有实例?当然,我可以用脏的方式做到这一点:
std::integral_constant<decltype(((Test*)nullptr)->f()), 5>;
但毫无疑问,这很漂亮,非常丑陋,应该有一种干净,直接的C ++表达方式。
答案 0 :(得分:5)
&Test::f
不会调用成员函数Test::f
。相反,它takes the address of the member function并生成pointer to member function,其类型为int (Test::*)()
。
为了做你想做的事,你应该使用std::declval
。正确的语法是
std::integral_constant<decltype(std::declval<Test>().f()), 5>