декларатор функции typedef - позиции параметров по умолчанию

Мое понимание объявлений функций всегда заключалось в том, что параметры значений по умолчанию объявляются после параметров, не являющихся значениями по умолчанию.

Но я только что заметил, что могу ввести объявление функции, которое нарушает это правило:

  typedef           // type of "int my_function ( int=1 , int )"
  int               // return type
  ( t_func_ptr )    // function type name
  ( int = 1         // arg0, default value - declared before non-default
  , int             // arg1
  ) ;

  /*
  // this wont compile, so why be able to typedef it?
  int my_bad_function ( int=1 , int )
  {
  } ;
  */

Мне любопытно узнать, почему typedef возможен?

РЕДАКТИРОВАТЬ: я скомпилировал с рядом компиляторов (я использую кросс-целевую IDE), не уверен в версиях базового компилятора, нужно проверить, но цели предназначены для окон (mingw), linux ubuntu, avr, arduino (atmega , due, uno), raspberrypi, микрочип (чипкит) и т. д. — Майкл Коллиер 2 часа назад

  • i686-w64-mingw32-g++ (GCC) 4.8.2
  • g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
  • avr-g++ (GCC) 4.8.1
  • arm-none-eabi-g++ (GNU Tools for ARM Embedded Processors) 4.8.3 20140228 (release) [ARM/embedded-4_8-branch revision 208322]
  • pic32-g++ (chipKIT) 4.5.1 chipKIT Compiler for PIC32 MCUs v1.31-20120614
  • arm-none-eabi-g++ (GNU Tools for ARM Embedded Processors) 4.7.4 20130913 (release) [ARM/embedded-4_7-branch revision 202601]
  • msp430-g++ (MSPGCC 20120406 (With patches: sf3540953 sf3559978))
  • 4.6.3 20120301 (mspgcc LTS 20120406 unpatched)
  • arm-linux-gnueabihf-g++ (crosstool-NG 1.17.0) 4.7.2

person Michael Collier    schedule 31.08.2016    source источник
comment
Какой компилятор вы используете? Какая его версия? Мой компилятор (недавний clang trunc) этого не позволяет.   -  person Some programmer dude    schedule 31.08.2016
comment
Может ли это быть неопределенным поведением (опять же)?   -  person J. Chomel    schedule 31.08.2016
comment
g++ v4.9.3 выдает компиляцию с ошибкой: аргументы по умолчанию разрешены только для параметров функции - мало того, что он не принимает неправильный порядок, но вообще не принимает параметры в func typedefs. Так какой же убогий компилятор ты используешь?   -  person Adrian Colomitchi    schedule 31.08.2016
comment
Я скомпилировал с помощью ряда компиляторов (я использую кросс-целевую IDE), не уверен в версиях базового компилятора, нужно проверить, но цели предназначены для Windows (mingw), linux ubuntu, avr, arduino (atmega, из-за , uno), raspberrypi, микрочип (чипкит) и т. д.   -  person Michael Collier    schedule 31.08.2016
comment
i686-w64-mingw32-g++ (GCC) 4.8.2 g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 avr-g++ (GCC) 4.8.1 arm-none-eabi-g++ (Инструменты GNU для ARM Embedded Processors) 4.8.3 20140228 (выпуск) [ARM/embedded-4_8-branch, редакция 208322] pic32-g++ (chipKIT) 4.5.1 Компилятор chipKIT для микроконтроллеров PIC32 v1.31-20120614 arm-none-eabi-g++ (GNU Tools для встроенных процессоров ARM) 4.7.4 20130913 (выпуск) [ARM/embedded-4_7-branch, редакция 202601] msp430-g++ (MSPGCC 20120406 (с исправлениями: sf3540953 sf3559978)) 4.6.3 20120301 (mspgcc LTS 6012040 без исправлений) -gnueabihf-g++ (crosstool-NG 1.17.0) 4.7.2   -  person Michael Collier    schedule 31.08.2016
comment
Извините за форматирование, я учусь пользоваться этой страницей..   -  person Michael Collier    schedule 31.08.2016
comment
добавлены различные версии компилятора, проверенные по комментариям   -  person J. Chomel    schedule 31.08.2016
comment
Это невозможно сделать; не before и не later, не логично делать. Будь то в простой функции int f( int=0, int ) or typedef` или в функции template.   -  person Shakiba Moshiri    schedule 02.09.2016


Ответы (2)


Аргументы по умолчанию разрешены только в списках параметров объявлений функций и лямбда-выражений (начиная с C++14) и не допускаются в объявлениях указателей на функции, ссылках на функции или в объявлениях typedef. (например, см. http://en.cppreference.com/w/cpp/language/default_arguments< /а>).

В g++ были проблемы при объявлении типов указателей на функции/функций без указателей, которые принимают параметры функции по умолчанию (см. ошибка 28262 и g++ v4.7.3, g++ v4.8.1).

Ошибка была исправлена ​​в версии 4.9.0.

person manlio    schedule 02.09.2016

Это невозможно сделать; не раньше и не позднее.
Возможно, это ошибка вашей версии.

Это не логично делать.

Будь то в
- простая функция int f( int=0, int ) или
- функция typedef или
- функция шаблона


Если параметр по умолчанию возможен на первом месте, то при вызове функции комплиер получает неоднозначное представление, какой аргумент принадлежит первому месту.

person Shakiba Moshiri    schedule 02.09.2016