Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 输入"信息"';t解释简历限定词:这是对的吗?_C++_G++_Constants_Volatile_Rtti - Fatal编程技术网

C++ 输入"信息"';t解释简历限定词:这是对的吗?

C++ 输入"信息"';t解释简历限定词:这是对的吗?,c++,g++,constants,volatile,rtti,C++,G++,Constants,Volatile,Rtti,这段代码打印1是正确的行为还是g++4.5的一个怪癖 #include <iostream> #include <typeinfo> using namespace std; int main(){ struct A{}; cout<<(typeid(A)==typeid(const A)&&typeid(A)==typeid(const volatile A)&&typeid(A)==typeid(volat

这段代码打印1是正确的行为还是g++4.5的一个怪癖

#include <iostream>
#include <typeinfo>
using namespace std;

int main(){
    struct A{};
    cout<<(typeid(A)==typeid(const A)&&typeid(A)==typeid(const volatile A)&&typeid(A)==typeid(volatile A));
}
#包括
#包括
使用名称空间std;
int main(){
结构A{};

CUT< P> <代码> Type ID<代码>忽略CV限定符,按照C++标准(取自于ISO/IEC 1488∶2003中的5.2.8):

左值表达式的顶级cv限定符或typeid的操作数类型id始终为 忽略。[示例:

-[结束示例]


因此,您看到的结果是预期的。

正如@sanderedycker提到的,cv限定符被忽略。但不是指针

例如:

#include <iostream>
#include <typeinfo>

int main()
{
    int bar = 1;
    const int cbar = 10;
    volatile int vbar = 10;
    const volatile int cvbar = 1000;
    int &rbar = bar;
    const int &crbar = bar;
    volatile int &vrbar = bar;
    const volatile int &cvrbar = bar;
    int *pbar = &bar;
    const int *cpbar = &bar;
    volatile int *vpbar = &bar;
    const volatile int *cvpbar = &bar;
    const volatile int * const cvpcbar = &bar;
    const volatile int * const volatile cvpcvbar = &bar;
    int&& rrbar = 894354;
    const int&& rrcbar = 894354;

    std::cout << typeid(bar).name() << '\n';
    std::cout << typeid(cbar).name() << '\n';
    std::cout << typeid(vbar).name() << '\n';
    std::cout << typeid(cvbar).name() << '\n';
    std::cout << typeid(rbar).name() << '\n';
    std::cout << typeid(crbar).name() << '\n';
    std::cout << typeid(vrbar).name() << '\n';
    std::cout << typeid(cvrbar).name() << '\n';
    std::cout << typeid(pbar).name() << '\n';
    std::cout << typeid(cpbar).name() << '\n';
    std::cout << typeid(vpbar).name() << '\n';
    std::cout << typeid(cvpbar).name() << '\n';
    std::cout << typeid(cvpcbar).name() << '\n';
    std::cout << typeid(cvpcvbar).name() << '\n';
    std::cout << typeid(rrbar).name() << '\n';
    std::cout << typeid(rrcbar).name() << '\n';
    std::cout << "\n\n";
}

正如您所见,在涉及指针的5种情况下,cv限定符不会被忽略。MSV或g++和C++11、C++14、C++17的输出是相同的。

这里有一个关于比较两个typeid运算符结果的“问题”。即,引用“不能保证同一类型上的typeid表达式的所有计算都会引用同一个std::type\u info实例,尽管这些type\u info对象的std::type\u info::hash\u代码和它们的std::type\u索引是相同的。”typeid(d1)=typeid(d2)@JohnZ.Li:
std::type_info
定义了一个
运算符==
,如果两个值描述相同的类型,该运算符将返回true。我误解了标准的措辞,Sander De Dycker是正确的。忽略的是顶级cv限定符(正如Sander的回答所解释的)
#include <iostream>
#include <typeinfo>

int main()
{
    int bar = 1;
    const int cbar = 10;
    volatile int vbar = 10;
    const volatile int cvbar = 1000;
    int &rbar = bar;
    const int &crbar = bar;
    volatile int &vrbar = bar;
    const volatile int &cvrbar = bar;
    int *pbar = &bar;
    const int *cpbar = &bar;
    volatile int *vpbar = &bar;
    const volatile int *cvpbar = &bar;
    const volatile int * const cvpcbar = &bar;
    const volatile int * const volatile cvpcvbar = &bar;
    int&& rrbar = 894354;
    const int&& rrcbar = 894354;

    std::cout << typeid(bar).name() << '\n';
    std::cout << typeid(cbar).name() << '\n';
    std::cout << typeid(vbar).name() << '\n';
    std::cout << typeid(cvbar).name() << '\n';
    std::cout << typeid(rbar).name() << '\n';
    std::cout << typeid(crbar).name() << '\n';
    std::cout << typeid(vrbar).name() << '\n';
    std::cout << typeid(cvrbar).name() << '\n';
    std::cout << typeid(pbar).name() << '\n';
    std::cout << typeid(cpbar).name() << '\n';
    std::cout << typeid(vpbar).name() << '\n';
    std::cout << typeid(cvpbar).name() << '\n';
    std::cout << typeid(cvpcbar).name() << '\n';
    std::cout << typeid(cvpcvbar).name() << '\n';
    std::cout << typeid(rrbar).name() << '\n';
    std::cout << typeid(rrcbar).name() << '\n';
    std::cout << "\n\n";
}
int
int
int
int
int
int
int
int
int * __ptr64
int const * __ptr64
int volatile * __ptr64
int const volatile * __ptr64
int const volatile * __ptr64
int const volatile * __ptr64
int
int