【发布时间】:2015-08-03 09:00:03
【问题描述】:
我正在尝试在 Visual Studio 2012 的成员函数上使用 decltype。我偶然发现了一个特性,我想知道这是有意还是编译器错误。考虑一下(只是一个代码sn-p,没有表明我的意思):
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' : cannot convert from 'int' to 'int (__thiscall Test::*)(void)'
对函数的实例化调用中的 decltype 为何会产生其返回类型(这是我所期望的),但是尝试在不涉及任何成员的情况下执行相同操作会产生成员函数指针?如果这是预期的行为,其背后的原因是什么?我如何表示我正在请求成员函数的返回类型,而实际上手头没有实例?当然我可以用肮脏的方式来做:
std::integral_constant<decltype(((Test*)nullptr)->f()), 5>;
但毫无疑问,这非常漂亮,非常丑陋,应该有一种干净、直接的 C++ 方式来表达这一点。
【问题讨论】:
-
您是否要提取 f() 的返回类型?
-
是的,如果我是对的,这就是 decltype 应该做的。
标签: c++ function instance member decltype