我很好奇为什么编译器不会抱怨如果我将一个const-pointer指向非const-pointer作为自身类的构造函数中的参数,当然这在构造时不是const。
#include <iostream>
class A
{
public:
A(int* v) : v(v) {}
int* v;
};
class B
{
public:
B() : o(23), v(&o) {}
const A cc() const
{
return A(v); //expected const to non-cosnt error here, but seems valid
}
int o;
int* v;
};
int main() {
B b;
const B* bc = &b;
A a = bc->cc();
*(a.v) = 25; // here I'm changing an originally const value
std::cout << b.o << std::endl;
return 0;
}
将cc()定义为const我期望初始化返回值的行有关将const转换为非const的错误消息。代码片段编译得很好,最后我得到输出“25”,即使应该是const。
答案 0 :(得分:2)
A
构造函数需要指针的副本而不是引用。将int * const
复制到int*
是完全合法的。因此,不会发生错误。
当您需要关于constness的一致行为时,应该使用引用而不是指针。顺便说一句,返回const对象是一个坏主意。
答案 1 :(得分:2)
您感到困惑int const*
(或const int*
)和int* const
。
将const
对象复制到非const
新对象中是否合适,无论该对象是否为指针。这就是你在这里所做的一切;指针本身是const
(它是int* const
),所以你可以用你的副本做你喜欢的事。
什么不确定将int const*
复制到int*
,因为现在你说的是被指向的东西神奇地丢失了它const
- 保护。
答案 2 :(得分:0)
const
不会传播到指针成员的指针的const
。指针变为const
但指针对象保持非const
。即使指针是const
,您也可以通过简单地复制指针来轻松获得非const
指针,这正是指针按值传递时发生的情况。