decltype для разыменованого указателя на функцию

Является ли различное поведение компиляторов при разыменовании указателя на функцию багом или результатом неопределенности в стандарте? Или, возможно, это вообще "особенность" MSVC?

using foo_t = int();

foo_t& foo_ref(foo_t* f) { return *f; }
foo_t* foo_ptr(foo_t* f) { return  f; }

using foo_ref_type = decltype( foo_ref( std::declval<foo_t*>() ));
using foo_ptr_type = decltype(*foo_ptr( std::declval<foo_t*>() ));

static_assert(std::is_same_v<foo_ref_type, foo_ptr_type>);

На GCC и Clang static_assert проходит успешно (пробовал на godbolt и на QtCreator(mingw1120_64 gcc), а на MSVC фейлится (godbolt и VisualStudio 2022). Пробовал разные версии, стандарты.

https://godbolt.org/z/sE3bPPac5


Ответы (0 шт):