gpt4 book ai didi

c++ - 为什么允许在初始化列表中从 const pointer-to-const 转换为 const pointer-to-nonconst

转载 作者:搜寻专家 更新时间:2023-10-31 01:07:54 24 4
gpt4 key购买 nike

我阅读了发布在 Why does C++ not have a const constructor?

我仍然很困惑为什么那个程序可以编译。并且我试图就这个问题提出我的意见,我不知道为什么它被删除了。所以我得再问一遍。

这是程序

class Cheater
{
public:
Cheater(int avalue) :
value(avalue),
cheaterPtr(this) //conceptually odd legality in const Cheater ctor
{}

Cheater& getCheaterPtr() const {return *cheaterPtr;}
int value;
private:
Cheater * cheaterPtr;
};
int main()
{
const Cheater cheater(7); //Initialize the value to 7

// cheater.value = 4; //good, illegal
cheater.getCheaterPtr().value = 4; //oops, legal
return 0;
}

我的困惑是:

const Cheater 骗子(7)在其构造函数中创建一个 const 对象作弊器

  Cheater(int avalue) :
value(avalue),
cheaterPtr(this) //conceptually odd legality in const Cheater ctor
{}

'this' 指针用于初始化 cheaterPtr

我觉得应该不对。 cheater 是一个 const 对象,它的 this 指针应该是这样的: const Cheater* const this; 这意味着它自身的指针和指针指向的对象都应该是 const ,我们既不能改变指针的值,也不能修改指针指向的对象。

但是对象 cheatercheaterPtr 成员类似于 Cheater* const cheaterPtr。这意味着指针是 const 但它指向的对象可以是非常量。

正如我们所知,不允许将指向常量的指针转换为指向非常量的指针:

int i = 0;
const int* ptrToConst = &i;
int * const constPtr = ptrToConst; // illegal. invalid conversion from 'const int*' to 'int*'

如何在初始化列表中允许从指向常量的指针转换为指向非常量的指针?究竟发生了什么?

这是我试图提供给原始帖子的关于构造函数中“constness”的描述:

“与其他成员函数不同,构造函数不能声明为const。当我们创建一个类类型的const对象时,该对象在构造函数完成对象初始化之前不会假定其‘constness’。因此,构造函数可以在构造过程中写入 const 对象。”

--C++ Primer(第5版)P262 7.1.4构造函数

最佳答案

如果构造器是const,它们就不能构造它们的对象——它们不能写入它的数据!

您引用为“合法”的代码:

cheater.getCheaterPtr().value = 4;    //oops, legal

实际上是不合法的。当它编译时,它的行为是未定义的,因为它通过一个非 const 左值修改了一个 const 对象。与此完全相同:

const int value = 0;
const int * p = &value;
*const_cast<int*>(p) = 4;

这也可以编译,但它仍然是非法的(有 UB)。

关于c++ - 为什么允许在初始化列表中从 const pointer-to-const 转换为 const pointer-to-nonconst,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18713315/

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