Я не уверен, что прекрасно понимаю [dcl.type]/4.3
:
Для выражения e
тип, обозначаемый decltype(e)
, определяется следующим образом:
- [...]
- (4.3) в противном случае, если
e
является не заключенным в скобки id-выражением или доступом к члену класса без скобок, decltype(e)
является типом сущностиназванный e
.Если такой сущности нет или , если e
называет набор перегруженных функций, программа некорректна ; - [...]
Для меня выделенная часть относится и к id-выражению и доступу члена класса , верно?
Играя с моим любимым компилятором, я получаюследующее.
✓ Принято компилятором
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?и то и другое?никто?kamoulox