Есть ли новый формат выражения типа функции в С++ 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.