The following code compiles successfully with g++ 4.8.1:
int main()
{
int(*)();
}
It looks like a simple declaration of a pointer to function:
int(*f)();
It doesn't compile with clang 3.4 and vc++ 2013.
Is it a compiler bug or one of dark places of the standard?
List of similar strange code pieces which compile fine with g++ 4.8.1 (updated):
int(*)();
int(*);
int(*){};
int(*());
Live example with these strange code pieces.
Update 1: @Ali added some interesting information in the comments:
All 4 cases give a compile error with clang 3.5 trunk (202594) and compile fine with gcc 4.9 trunk (20140302). The behavior is the same with -std=c++98 -pedantic
, except for int(*){};
which is understandable; extended initializer lists only available with -std=c++11
.
Update 2: As @CantChooseUsernames noted in his answer they still compile fine even with initialization and no assembly is generated for them by g++ (neither with nor without initialization) even without any enabled optimization:
int(*)() = 0;
int(*) = 0;
int(*){} = 0;
int(*()) = 0;
Live example with initializations.
Update 3: I was really surprised to find that int(*)() = "Hello, world!";
compiles fine, too (while int(*p)() = "Hello, world!";
doesn't compile, of course).
Update 4: It is fantastic but int(*){} = Hello, world!;
compiles fine. And the following extremely strange piece of code, too: int(*){}() = -+*/%&|^~.,:!?$()[]{};
(live example).
Update 5: As @zwol noted in his comment
This and a number of related syntactic problems are being tracked as gcc bug 68265.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…