Забавный баг имеет компилятор
GCC 4.7.1, относящийся к использованию
trailing-return-type. Этот баг позволяет разбить список спецификаторов типа на две части. Одна часть будет указана в самом списке спецификаторов типа, а другая часть в
trailing-return-type. Чтобы было понятно, то приведу конкретный пример демонстрационного кода.
void f( unsigned ( * )() -> int ) {}
unsigned int h() { return 0; }
int main()
{
f( h );
}
В этом примере функция
f объявляет параметр в виде указателя на функцию. Возвращаемый тип этой функции, который должен быть
unsigned int разбит на две части. Первая часть с ключевым словом
unsigned находится в списке спецификаторов типа, а вторая часть с ключевым словом
int расположена в
trailing-return-type.
Код примера успешно компилируется и выполняется компилятором
GCC 4.7.1, хотя в объявлении параметра функции
f используется некорректная синтаксическая конструкция.
Согласно параграфу №2 раздела 8.3.5 Functions стандарта С++
цитата: |
2 In a declaration T D where D has the form D1 ( parameter-declaration-clause ) cv-qualifier-seqopt ref-qualifieropt exception-specificationopt attribute-specifier-seqopt trailing-return-type and the type of the contained declarator-id in the declaration T D1 is “derived-declarator-type-list T”, T shall be the single type-specifier auto. |
|
То есть возможны лишь два вида объявления данного параметра. Либо как
unsigned int ( * )() без включения
trailing-return-type, либо как
auto ( * )() -> unsigned int с единственным спецификатором типа
auto.
Нужно отдать должное компилятору
MS VC++ 2010, что он в отличии от
GCC 4.7.1 код исходного демонстрационного примера не компилирует, то есть поступает в соответствии со стандартом С++.