typeid 导致不同的编译器

typeid result in different compilers

我正在看以下video

这里提到g++对于以下代码会报错:

#include<vector>
#include<typeinfo>
#include<iostream>
struct S
{
    std::vector<std::string> b ;
};
int main()
{
    S s;
    std::cout << typeid(S::b).name();
}
error: invalid use of non-static data member ‘S::b’

但是我在msvc和clang下没有遇到这种错误。谁是对的,为什么? 以及为什么改为

typeid(&S::b).name();

之后的结果对吗?

Gcc 错误 (Bug 68604)。 S::b 是引用非静态数据成员的 id 表达式,只能在未计算的上下文中使用。 Gcc 似乎无法将其视为未计算的表达式。

作为解决方法,您可以:

std::cout << typeid(decltype(S::b)).name();

注意在typeid(&S::b).name();中,&S::b给出了一个指向member的指针;结果与使用 S::b.

不同