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
.
不同
我正在看以下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
.