Является ли decltype нестатической функции-члена плохо сформированной? - PullRequest
0 голосов
/ 26 сентября 2018

Я не уверен, что прекрасно понимаю [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

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Стоит отметить, что decltype(&S::f) работает здесь как тип указателя на функцию-член,
снова, если только f не называет набор перегруженных (членских) функций.

ФункцияСам тип может быть извлечен из типа указатель на член-функцию.
Если функция-член имеет квалификацию cv-or-ref, то она имеет отвратительный тип функции .
Здесь отсутствуют стандартные черты - помогает такая библиотека, как Boost.CallableTraits .

0 голосов
/ 26 сентября 2018

Простая причина в том, что использование S::f ограничено для членов класса.

[expr.prim.id]

2 Идентификационное выражение, которое обозначает нестатический член данных или нестатическую функцию-член класса, может использоваться только:

  • как часть доступа к члену класса, в которомВыражение объекта ссылается на класс члена или класс, производный от этого класса, или
  • для формирования указателя на член ([expr.unary.op]), или
  • , если это id-выражениеобозначает нестатический элемент данных, и он отображается в неоцененном операнде.

Последний элемент, связанный с вашим кодом, применяется только к элементу нестатических данных.Там нет положения для функций.

Я могу только догадываться, почему это не разрешено, , хотя я ранее задавал этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...