相关问题:template-function-is-same-in-template-classes
我对指针“this”(gcc 4.7.2,c ++ 11)的类型有点不安。原则上,例如,类型C的非const对象的指针“this”的类型是“C * const”,因此,“* this”的类型是“C”。但是“is_same”类的行为使我感到困惑。
测试:
// this-type.cpp
#include <iostream>
#include <type_traits>
using namespace std;
class C
{
public:
void test()
{
cout << boolalpha;
cout << "'this' const?" << " "
<< is_const<decltype(this)>::value << endl;
cout << "'*this' const?" << " "
<< is_const<decltype(*this)>::value << endl;
cout << "'*this' and 'C' the same?" << " "
<< is_same<decltype(*this), C>::value << endl;
cout << "'this' and 'C*' the same?" << " "
<< is_same<decltype(this), C*>::value << endl;
}
};
int main()
{
C c;
c.test();
}
输出:
$ g++ --version | grep g++
g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
$ g++ -std=c++11 this-type.cpp
$ ./a.out
'this' const? false
'*this' const? false
'*this' and 'C' the same? false
'this' and 'C*' the same? true
但是,预期的输出是:
$./a.out
'this' const? true // C* const
'*this' const? false // C
'*this' and 'C' the same? true
'this' and 'C*' the same? false // C* const vs. C*
这里发生了什么?
答案 0 :(得分:3)
9.3.2 this指针[class.this]
1 - [...]关键字
this
是一个prvalue表达式,其值 是调用该函数的对象的地址。类this
的成员函数中X
的类型为X*
。
this
不是const
左值,它是一个prvalue表达式,因此它不需要是const
。你无法分配它,因为它是一个prvalue,与你不能写2 + 2 = 5
的原因相同。
答案 1 :(得分:2)
在这种情况下,this
的类型为C *
9.3.2这个指针[class.this]
在非静态(9.3)成员函数的主体中,关键字this是prvalue 表达式,其值是调用该函数的对象的地址。 类X的成员函数中的类型是X *。
...
X *const
没有提及等。this
指针是 prvalue ,这就是为什么它不能被分配,而不是因为它符合const。
PS。顺便说一句,似乎
C *p; // for any type C
is_same<declype (*p), C &>::value == true
虽然它可能是实现的一个假象(编译器或is_same
),因为标准说:
5.3.1一元运算符[expr.unary.op]
1 ...
...如果表达式的类型是“指向T的指针”,则结果的类型为“T”......