gpt4 book ai didi

c++ - 带有指针 this 的模板函数 "is_same",意外行为?

转载 作者:太空宇宙 更新时间:2023-11-04 16:24:01 26 4
gpt4 key购买 nike

相关问题:template-function-is-same-in-template-classes

我对指针“this”的类型感到有点不安(gcc 4.7.2,c++11)。原则上,例如C类型的非常量对象的指针“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*

这里发生了什么?

最佳答案

9.3.2 The this pointer [class.this]

1 - [...] the keyword this is a prvalue expression whose value is the address of the object for which the function is called. The type of this in a member function of a class X is X*.

this 不是const 左值,它是一个纯右值表达式,因此它不需要是const。你不能给它赋值,因为它是纯右值,这与你不能写 2 + 2 = 5 的原因相同。

关于c++ - 带有指针 this 的模板函数 "is_same",意外行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com