【问题标题】:typeid result in different compilerstypeid 导致不同的编译器
【发布时间】:2021-12-23 23:32:39
【问题描述】:

我在看下面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();

之后的结果正确吗?

【问题讨论】:

    标签: c++ visual-c++ g++ clang++ typeid


    【解决方案1】:

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

    作为解决方法,您可以:

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

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

    【讨论】:

    • 谢谢,您能告诉我您是如何快速找到此链接的吗?我搜索了编译器输出的错误,但是没有找到这样的结果
    • @fqq 我在GCC Bugzilla上直接搜索了关键字typeid非静态数据成员
    • 哇,效率很高。
    • typeid 通常不是未评估的上下文。
    • Bugzilla 链接回一个旧的 StackOverflow 问题,这个问题重复了。
    猜你喜欢
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2013-02-15
    相关资源
    最近更新 更多