鉴于以下声明:
struct MyClass { };
typedef int MyClass::*Mp;
Run Code Online (Sandbox Code Playgroud)
在gcc 6.2和Clang编译器上我都尝试过,result_of<Mp(const MyClass)>::type收益率int&&.
我的问题摘要:为什么int&&而不是const int&&或者只是简单int?
更多背景:标准说这result_of是这样定义的:
成员typedef类型应该命名类型
decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...));
该标准还以这种方式为指针指向成员对象定义INVOKE:
- 当N == 1时,t1.*f,f是指向T类数据成员的指针,
is_base_of_v<T, decay_t<decltype(t1)>>为真;
请注意,这decay_t仅用于测试此项目是否适用.据我所知,应用上述两点应该产生:
decltype(declval<const MyClass>().*declval<Mp>())
Run Code Online (Sandbox Code Playgroud)
哪个收益率const int&&.那么,我错过了什么,还是编译器库错了?
编辑,2016年8月30日:
谢谢你的回复.有几个人建议在不使用的情况下获得正确结果的替代方法result_of.我应该澄清一下,我挂在正确定义上的原因result_of是我实际上实现了最接近的合理实现,result_of它适用于前C++ 11编译器.所以,虽然我同意,我可以使用decltype或result_of<Mp(const MyClass&&)>::type在C++ 11,他们没有做什么,我需要为C++ 03.有几个人给出了正确的答案,即函数的const rvalue参数不是函数类型的一部分.这为我澄清了一些事情,我将实现我的预C++ 11,result_of这样它也会丢弃这些限定符.