Следующий код успешно компилируется с g++ 4.8.1:
int main()
{
int(*)();
}
Это похоже на простое объявление указателя на функцию:
int(*f)();
Он не компилируется с clang 3.4 и vС++ 2013.
Является ли это ошибкой компилятора или одним из темных мест стандарта?
Список похожих странных фрагментов кода, которые компилируются с помощью g++ 4.8.1 (обновлено):
-
int(*)();
-
int(*);
-
int(*){};
-
int(*());
Живой пример с этими странными фрагментами кода.
Обновление 1: @Ali добавило интересную информацию в комментарии:
Все 4 случая дают ошибку компиляции с соединительной шиной 3.5 (202594) и компилируются с помощью gcc 4.9 trunk (20140302). Поведение одинаково с
-std=c++98 -pedantic
, за исключениемint(*){};
, что понятно; расширенные списки инициализаторов доступны только с-std=c++11
.
Обновить 2: Как @CantChooseUsernames, отмеченный в его answer они по-прежнему компилируются даже при инициализации, и для них не создается сборка g++ (ни с инициализацией, ни без нее) даже без какой-либо активированной оптимизации:
-
int(*)() = 0;
-
int(*) = 0;
-
int(*){} = 0;
-
int(*()) = 0;
Живой пример с инициализацией.
Обновление 3: Я был очень удивлен, обнаружив, что int(*)() = "Hello, world!";
тоже компилируется (пока int(*p)() = "Hello, world!";
не компилируется, конечно).
Обновление 4: Это фантастика, но int(*){} = Hello, world!;
компилируется отлично. И следующий чрезвычайно странный фрагмент кода: int(*){}() = -+*/%&|^~.,:!?$()[]{};
(живой пример).
Обновить 5:. @zwol отмечен в его комментарии
Это и ряд связанных синтаксических проблем отслеживаются как gcc ошибка 68265.