【问题标题】:How to use decltype with member functions如何将 decltype 与成员函数一起使用
【发布时间】: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


【解决方案1】:

&amp;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>

【讨论】:

  • 是的,THX,解决了它。除了&amp;Test::f,我还测试了离开地址运算符和其他不同的东西,当然没有任何结果。 VS 的帮助中没有提到std::declval,我过早地断定它不存在。然而这不是真的,标题&lt;type_traits&gt; 有它。
猜你喜欢
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 2014-10-08
相关资源
最近更新 更多