【发布时间】:2016-02-10 23:03:39
【问题描述】:
是否可以强制编译器在我的类中传播 const 限定符,以便为构造函数提供 const 指针?考虑以下代码:
struct T
{
T(int * a, int * b):
a(a), b(b) {}
int * a;
int * b;
};
int a = 1, b = 2;
const int * aRef = &a;
const int * bRef = &b;
const T obj(aRef, bRef); // error
这显然是不允许的,因为构造函数接受int *,而不是const int *。如果不打算修改 T 类的 const 对象中的 a 和 b 的数据,有什么方法可以达到相同的效果?
编辑 这是一个稍微复杂一点的例子,它更接近实际问题。想象一下,我按顺序传递了一些int[] 的大型数组(例如,连续 1000 个整数),我想评估 k-th 位置的元素的运行最大值(即运行最大值也是 1000-整数向量)。当我将const int * 传递到传入数组的开头时,我设计了一个结构
struct ArrayWithMax
{
public:
ArrayWithMax(int * array) : array(array) {}
void Max(const ArrayWithMax& rhs);
private:
int * array;
}
ArrayWithMax::Max 显然会循环遍历两个数组,并将最大值 (max(this->array[k], rhs.array[k]) 分配给对象的array。为简洁起见,我将跳过代码。
现在,我将存储结果的变量必须是非常量(因为 max-array 的元素会改变)。但是我收到的更新是const int *。对我来说最简单的方法是从 const int * 初始化 const ArrayWithMax,这正是问题试图实现的目标。
【问题讨论】:
-
实际上这不是 int* 而是一个指向内存繁重的类的指针,我不想取消引用和复制,因此问题。
-
那么非常量
T会发生什么? -
我认为如果构造函数需要非常量数据,那么要么构造函数在你的控制之下,你可以修改它以接受 const 数据,或者它不是,然后假设 const数据就足够了是错误的,即使今天恰好是这样。您显然可以使用 const_cast 来消除 const 性,但那是 hack 的味道。
-
@LogicStuff 我没有看到使用非常量指针初始化非常量 T 对象有任何问题;不需要用 const 指针初始化非 const T 对象(而且确实不合逻辑)。
-
@enrico-granata 构造函数确实在我的控制之下。我无法修改它以接受 const 数据,因为我需要 T 类型的非常量对象具有非常量
a和b。 const-cast 是一个选项,但考虑到我真的不想打破 const 规则,这是一个相当丑陋的选项。