gpt4 book ai didi

c++ - 结构初始化中的常量正确性

转载 作者:可可西里 更新时间:2023-11-01 18:38:16 25 4
gpt4 key购买 nike

我现在正在研究 C++ 和常量正确性。假设您具有以下结构

template <typename T>
struct important_structure {
public:
T* data;
int a;
important_structure(const T& el, int a);
void change();
};

template <typename T>
void important_structure<T>::change() {
//alter data field in some way
}

template <typename T>
important_structure <T>::important_structure(const T& el, int a) : data(&el), a(a) //error line {
};


int main() {
important_structure<int>* s = new important_structure<int>{5, 3};
}

使用 std=c++11 编译时,编译器返回以下错误:

invalid conversion from ‘const int*’ to ‘int*’

现在,我知道将 const int* 转换为 int* 是不安全的。问题是我有一个数据结构,我不想将字段 data 作为常量。

但是,我不想删除构造函数中的 const 限定符,因为我认为这对 future 的开发人员来说是有用的:它清楚地表明 el 不会t 被函数修改。 data 字段仍然可以被 important_structure 中的一些其他函数修改。

我的问题是:如何处理在构造函数中初始化并在其他函数中更改的字段?大多数 const 正确性涉及简单的答案,但没有问题(我认为)涉及将 const 参数传递给数据结构然后此类数据结构被其他人更改的场景。

谢谢你的回复

最佳答案

el 作为 const 引用传递不仅意味着该函数在函数运行期间不会更改 el,它还意味着由于这个函数调用,el 根本不会改变。将 el 的地址放入非常量 data 中,您违反了该 promise 。

因此,如果您确实想要更改数据,最干净的解决方案是删除 const。因为它对 future 的开发人员没有信息,而是误导。丢弃 const 在这里会非常糟糕。

关于c++ - 结构初始化中的常量正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48788503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com