在课堂上我们正在实现向量,但我不明白为什么输入运算符重载的代码有效:
istream& operator>> (istream& in, const Vector& A)
{
for (int i = 0; i < A.size; i++)
in >> A.data[i];
return in;
}
我尝试了代码,它运行得很好,但是即使我们输入 A 的值,向量引用怎么可能是 const 呢?!
假设
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
可以解决这个问题,无需额外的手动操作。
propconst
说明符,可以按如下方式使用:
struct Vector {
// propagate const one level deep
propconst(1) T* data;
};