为什么此代码会产生错误输出?
//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;,不是吗?
答案 0 :(得分: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
答案 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
调试行进行调查。