输入重载函数接收到的对象参数怎么可能是const

问题描述 投票:0回答:1

在课堂上我们正在实现向量,但我不明白为什么输入运算符重载的代码有效:

istream& operator>> (istream& in, const Vector& A)
{
    for (int i = 0; i < A.size; i++)
        in >> A.data[i];
    return in;
}

我尝试了代码,它运行得很好,但是即使我们输入 A 的值,向量引用怎么可能是 const 呢?!

c++ constants operator-overloading
1个回答
0
投票

假设

Vector
包含一些指向成员的
T* data
指针,
const Vector
的成员将是一个
T* const
指针。
T* const
是指向
const
T
指针,尽管
T
是可变的。

因此,

in >> A.data[i];
可以工作,因为它只是写入可变数据。 如果您希望常量深入传播到下一个指针,您必须自己确保这一点:

class Vector {
private:
    T* m_data;

public:
    T* data() {
        return m_data;
    }
    const T* data() const {
        return m_data;
    }
};

现在,

in >> A.data()[i]
将会失败,因为
A.data()
会产生一个指向
const T
的指针。

关于语言演化的注释

std::experimental::propagate_const
可以解决这个问题,无需额外的手动操作。

P2670:非瞬态 constexpr 分配提出了一个

propconst
说明符,可以按如下方式使用:

struct Vector {
    // propagate const one level deep
    propconst(1) T* data;
};
© www.soinside.com 2019 - 2024. All rights reserved.