不同编译器中 typeid 的结果

3

我正在观看以下视频

这里提到,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();

之后的结果正确吗?

1个回答

3

Gcc存在问题(Bug 68604)。S::b是一个指向非静态数据成员的标识表达式,只能在未求值上下文中使用。Gcc似乎无法将其视为未求值表达式而出现错误。

作为解决方法,您可以:

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

请注意,在 typeid(&S::b).name(); 中,&S::b 给出了成员指针;与使用 S::b 不同。

谢谢,你能告诉我你是如何快速找到这个链接的吗? 我搜索了编译器输出的错误,但没有找到相关结果。 - Kargath
2
@fqq 我直接在 GCC Bugzilla 上使用关键词 typeid 非静态数据成员 进行了搜索。 - songyuanyao
哇,这真是高效。 - 康桓瑋
typeid通常不是未求值的上下文。 - Ben Voigt
而且Bugzilla链接回到了一个旧的StackOverflow问题,这个问题是重复的。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接