Есть ли новый формат выражения типа функции в С++ 11?

Сегодня я проверил Часто задаваемые вопросы по Stroustrup С++ 11 (изменен 7 апреля, 2013) и увидели это в конце раздела с псевдонимом типа:

typedef void (*PFD)(double);    // C style
using PF = void (*)(double);    // using plus C-style type
using P = [](double)->void;     // using plus suffix return type

где lambda-интродуктор используется для запуска выражения общего типа функции, которое использует тип возвращаемого типа в стиле суффикса. Является ли это официальным лицом или брошенная функция бета-версии/списка пожеланий? Если он официально, как он будет работать для нестатических функций-членов?

Ответ 1

using P = [](double)->void;

не является официальным. Бьярне, как известно, немного небрежен в своих часто задаваемых вопросах.

Однако, что работает, выполните следующие действия:

using P1 = auto(double) -> void;
using P2 = auto(*)(double) -> void;

Где P1 - это тип функции, а P2 - тип указателя функции. Возможно, это было его намерением.

Ответ 2

Синтаксис Lambda не работает с нестационарными функциями-членами, поскольку по-разному реализуются функции-указатель-функция и указатель-член. Функция указатель-член не является регулярным указателем. Он не содержит "точный адрес", как это делает обычный указатель. Мы можем представить, что он содержит "относительный адрес", где функция находится в макете класса.

Если вам нужно передать указатель на функцию-член где-нибудь, используйте cosider std:: function.