我不确定是否完全理解[dcl.type]/4.3:
对于一个表达式e
,表示的类型decltype(e)
定义如下:
- [...]
- (4.3) 否则,如果
e
是不带括号的 id 表达式或不带括号的类成员访问,decltype(e)
是命名实体的类型e
。如果没有这样的实体,或者if e
命名一组重载函数,程序格式错误;
- [...]
对我来说,强调的部分都适用于id-表达式 and 类成员访问, right?
使用我最喜欢的编译器,我得到以下结果。
✓ 被编译器接受
namespace N { void f() {} }
using type = decltype(N::f);
type* pf = N::f;
我觉得可以吧;N::f
是一个不带括号的 id 表达式,并且不命名一组重载函数。
✗ 被编译器拒绝
namespace N { void f() {} void f(int) {} }
using type = decltype(N::f); // error: decltype cannot resolve address of overloaded function
type* pf = N::f;
Ok; N::f
确实命名了一组重载函数。
✗ 被编译器拒绝
struct S { void f(){} };
using type = decltype(S::f); // error: invalid use of non-static member function 'void S::f()'
type* pf = &S::f;
Hum? S::f
会命名一组重载函数吗?
总而言之,就是我的理解[dcl.type]/4.3
只是不好? gcc trunk 错了吗?两个都?没有任何?卡穆洛克斯?
原因很简单,就是使用S::f
仅限于班级成员。
[expr.prim.id]
2表示非静态数据成员的 id 表达式或
类的非静态成员函数只能使用:
- 作为类成员访问的一部分,其中对象表达式引用成员的类或从该类派生的类,或者
- 形成指向成员的指针 ([expr.unary.op]),或者
- 如果该 id 表达式表示非静态数据成员并且它出现在未计算的操作数中。
最后一个项目符号与您的代码相关,仅适用于非静态数据成员。没有提供功能。
我只能推测为什么不允许这样做虽然我之前问过这个问题.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)