Могу ли я использовать именованные параметры в аргументе типа подписи шаблона std:: function?
Могу ли я юридически использовать имена для параметров шаблона в std::function
(или другой аналогичной конструкции)? Например. с учетом кода
std::function<int(int, int)> some_func;
Можно ли переписать его следующим образом?
std::function<int(int begin, int end)> some_func;
Было бы очень приятно, если бы оно было стандартным, потому что только этот тип содержит небольшую информацию о цели этого параметра.
До сих пор я тестировал его в Visual Studio 2013, и он работает. Изменить: он также работает с gcc 4.8.1.
Ответы
Ответ 1
Да, вы можете указать имя параметра. Из пункта 8.3.5/11 стандарта С++ 11:
Идентификатор может быть необязательно представлен как имя параметра;
То же самое относится к типу функции "указатель-к-функции" и "указатель-к-член". Лично я бы использовал идентификатор, только если он более четко выражает намерение вашего кода.
Ответ 2
Для юристов языка:
Грамматика этого допускает. Является ли это преднамеренным, неясно мне. Объявление и абстрактно-декларатор отличаются тем, что последний не позволяет имя на верхнем уровне.
описатель:
- PTR-описатель
- noptr-declarator parameters-and-qualifiers trailing-return-type
PTR-описатель:
- noptr-описатель
- ptr-operator ptr-declarator
noptr-описателя:
- declarator-id attribute-specifier-seq (opt)
- noptr-declarator parameters-and-qualifiers
- noptr-declarator
[
константа-выражение (opt) ]
attribute-specifier-seq (opt)
-
(
ptr-declarator )
Обратите внимание, что в деклараторе вы можете иметь идентификатор-декларатор, то есть имя. Теперь рассмотрим синтаксис abstract-declarator:
абстрактный-описатель:
- PTR-абстрактно-описатель
- noptr-abstract-declarator (opt) параметры и квалификаторы trailing-return-type
- абстрактно-пак-описатель
PTR-абстрактно-описатель:
- noptr-абстрактно-описатель
- ptr-operator ptr-abstract-declarator (opt)
noptr-абстрактного-описатель:
- noptr-abstract-declarator (opt) параметры и квалификаторы
- noptr-abstract-declarator (opt)
[
константа-выражение (opt) ]
attribute-specifier-seq (opt)
-
(
ptr-abstract-declarator )
Абстракт-декларатор не может содержать идентификатор объявления на верхнем уровне. Однако обратите внимание, что параметры и квалификаторы, которые встречаются в правилах создания для абстрактного-декларатора и noptr-abstract-declarator, такие же, как в declarator и noptr-declarator. Для абстрактного-декларатора нет специальных абстрактных-параметров-и-квалификаторов для обеспечения отсутствия имени в списке параметров. Таким образом, грамматика позволяет определять имена для параметров функции внутри абстрактных деклараторов, даже если общий тип функции не может быть присвоен имени.