4

このコードが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));
}

私は、cv修飾子が異なるタイプは、cv修飾されていないタイプが暗黙的に、cv修飾されたタイプにキャストされる可能性があるとしても、非常に異なるタイプとして脅かされていると思いました。

4

2 に答える 2

5

typeidC ++標準(ISO / IEC 14882:2003の§5.2.8から取得)に従って、cv修飾子を無視します。

左辺値式の最上位のcv修飾子、またはtypeidのオペランドであるtype-idは常に無視されます。[例:

class D { ... };
D d1;
const D d2;

typeid(d1) == typeid(d2);       // yields true
typeid(D) == typeid(const D);   // yields true
typeid(D) == typeid(d2);        // yields true
typeid(D) == typeid(const D&);  // yields true

-例を終了]

だから、あなたが見ている結果は期待されています。

于 2012-04-04T08:56:55.250 に答える
1

@SanderDeDyckerが述べたように、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";
}

出力

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

ご覧のとおり、ポインターが関係する5つのケースでは、cv修飾子は無視されません。出力は、MSVSまたはg++とC++ 11、C ++ 14、C++17で同じです。

于 2018-09-25T00:55:58.723 に答える