Clang отклоняет следующий код:
Код: Выделить всё
#include
struct k { static void f(); };
// clang nope, gcc ok, msvc ok
static_assert(std::same_as);
Похоже, что это сводится к тому, следует ли проверять decltype(k{}.f) либо как тип void(), либо как тип void (&)( ) или даже введите void (&&)(). При заключении скобок k{}.f (т. е.: decltype((k{}.f))) и Clang, и GCC согласовывают тип void (&)(), а MSVC рассматривает выражение как тип void (&&)(). Кажется, это говорит о том, что и GCC, и MSVC не рассматривают проверку типа простого k{}.f как выражение lvalue.
Я предполагаю, что не существует специального исключение с decltype при проверке статических функций-членов в форме k{}.f. Следовательно, означает ли это, что и GCC, и MSVC несовместимы?
Демо
Подробнее здесь:
https://stackoverflow.com/questions/790 ... r-function