5

このコードが誤った出力を生成するのはなぜですか?

//this-type.cpp  

#include <iostream>
#include <type_traits>

using namespace std;

template<typename testype>
class A
{
public:
    A()
    {
        cout << boolalpha;
        cout << is_same<decltype(*this), A<int>>::value << endl;
    }
};

class B : public A<int>
{
};

int main()
{
    B b;
}

出力:

$ g++ -std=c++11 this-type.cpp
$ ./a.out
false

A から B までの "*this" の型は A< int > ですね。

4

3 に答える 3

8

*thisは型の左辺値なAのでdecltype(*this)、参照型を与えますA &decltype左辺値で参照型が得られることを思い出してください。

    cout << is_same<decltype(*this), A<int>>::value << endl;
    cout << is_same<decltype(*this), A<int> &>::value << endl;

出力:

false
true
于 2012-12-12T15:42:40.090 に答える
2

試す:

typedef std::remove_reference<decltype(*this)>::type this_type;
cout << is_same<this_type, A<int>>::value << endl;

そして多分他のいくつかの文脈で(あなたが/remove_cvを気にしないなら)このように:constvolatile

typedef std::remove_reference<decltype(*this)>::type this_type;
typedef std::remove_cv<this_type>::type no_cv_this_type;
cout << is_same<no_cv_this_type, A<int>>::value << endl;
于 2012-12-12T15:48:03.350 に答える
0

本当にdecltype(*this)A ですか? 醜いcoutデバッグ行でそれを調査する必要があります。

于 2012-12-12T15:43:43.447 に答える