模板类中的模板函数is_same

时间:2012-12-12 15:37:27

标签: c++ types c++11 this

为什么此代码会产生错误输出?

//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&lt; int&gt;,不是吗?

3 个答案:

答案 0 :(得分:8)

*thisA类型的左值,因此decltype(*this)将提供引用类型A &。回想一下,左值上的decltype给出了引用类型:

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

输出:

false
true

答案 1 :(得分: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;

答案 2 :(得分:0)

您确定decltype(*this)是A吗?您应该使用丑陋的cout调试行进行调查。