Форум » C/C++ » Баг компилятора GCC 4.7.1 относящийся к использованию trailing-return-type » Ответить

Баг компилятора GCC 4.7.1 относящийся к использованию trailing-return-type

Сыроежка: Забавный баг имеет компилятор GCC 4.7.1, относящийся к использованию trailing-return-type. Этот баг позволяет разбить список спецификаторов типа на две части. Одна часть будет указана в самом списке спецификаторов типа, а другая часть в trailing-return-type. Чтобы было понятно, то приведу конкретный пример демонстрационного кода. [pre2] void f( unsigned ( * )() -> int ) {} unsigned int h() { return 0; } int main() { f( h ); }[/pre2] В этом примере функция f объявляет параметр в виде указателя на функцию. Возвращаемый тип этой функции, который должен быть unsigned int разбит на две части. Первая часть с ключевым словом unsigned находится в списке спецификаторов типа, а вторая часть с ключевым словом int расположена в trailing-return-type. Код примера успешно компилируется и выполняется компилятором GCC 4.7.1, хотя в объявлении параметра функции f используется некорректная синтаксическая конструкция. Согласно параграфу №2 раздела 8.3.5 Functions стандарта С++ [quote]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.[/quote] То есть возможны лишь два вида объявления данного параметра. Либо как unsigned int ( * )() без включения trailing-return-type, либо как auto ( * )() -> unsigned int с единственным спецификатором типа auto. Нужно отдать должное компилятору MS VC++ 2010, что он в отличии от GCC 4.7.1 код исходного демонстрационного примера не компилирует, то есть поступает в соответствии со стандартом С++.

Ответов - 0



полная версия страницы