clang
не компилирует третий вызов typeid
ниже (см. живой пример). Но я не вижу ничего в п. 5.2.8, который запрещает это, особенно если учесть, что выражение B::f
не является glvalue типа полиморфного класса (см. Пункт 3). Кроме того, согласно этому параграфу выражение B::f
является неоцененным операндом, и как таковой, вызов typeid(B::f)
должен компилироваться. Обратите внимание, что GCC
не компилирует ни один из вызовов typeid
ниже:
#include <iostream>
#include <typeinfo>
struct A{ int i; };
struct B{ int i; void f(); };
int main()
{
std::cout << typeid(A::i).name() << '\n';
std::cout << typeid(B::i).name() << '\n';
std::cout << typeid(B::f).name() << '\n';
}