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在其他一些情况下(如果你不关心const/ volatile)像这样:

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 回答