const指针指向构造函数中的非const指针

时间:2015-12-04 11:37:44

标签: c++ constructor g++

我很好奇为什么编译器不会抱怨如果我将一个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。

3 个答案:

答案 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指针,这正是指针按值传递时发生的情况。