https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67064
--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Sebastian Huber from comment #2) > Indeed -std=gnu++98 gets rid of this error. So this is working as intended > for C++11 and later? This is really nice in combination with defines and > macros that use ( ) around its content. >From http://en.cppreference.com/w/cpp/language/decltype : Note that if the name of an object is parenthesised, it becomes an lvalue expression, thus decltype(arg) and decltype((arg)) are often different types. Now I don't know the exact rules for lvalue expression so I don't know if it is working the correct way or not.