Следующий код успешно компилируется с 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.