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