我知道删除对象的常量的const_cast是不好的,
我有以下用例:
//note I cannot remove constness in the foo function
foo(const std::vector<Object> & objectVec) {
...
int size = (int) objectVec.size();
std::vector<Object> tempObjectVec;
//Indexing here is to just show a part of the vector being
//modified
for (int i=0; i < (int) size-5; ++i) {
Object &a = const_cast<Object&> objectVec[i];
tempObjectVec.push_back(a);
}
foo1(tempObjectVec);
} 如果我在foo1中更改tempObjectVec对象,ObjectVec中的原始对象是否会更改,我会说是,因为我正在传递引用,这进一步提高了效率。你能建议一下替代方案吗?
发布于 2009-01-06 02:28:45
好吧,这取决于对象。但是,当您将对象传递给push_back时,这些对象正在被复制。您可以通过向复制构造函数添加一些调试代码来检查这一点。因此,如果对象行为良好,并且保持不同的副本分离,那么foo1可以随心所欲地更改它获得的向量。
一种更有效的方法是让foo1接受开始和结束迭代器:
void foo1(std::vector<Object>::const_iterator start,
std::vector<Object>::const_iterator end);
...
foo1(objectVec.begin(), objectVec.end() - 5);如果您不使用const_cast,那么类型系统将确保foo1不会更改任何元素,因为这些元素是const_iterators。
发布于 2009-01-06 02:29:21
您的tempObjectVec不能是引用的向量,所以我假定它应该声明为如下形式:
std::vector<Object> tempObjectVec;在执行tempObjectVec.push_back(a)时,将创建对象的副本以将其推送到tempObjectVec向量中。由于这是一个副本,您甚至不需要使用const_cast来删除常量,我不清楚您为什么需要这样做。
发布于 2009-01-06 02:38:47
我相信这就是你想要的陈述:
const_cast<std::vector<Object>&> (objectVec)这将返回一个非常量std::vector的引用,这应该是foo1喜欢的(我假设是这样的)。
修改您的原始示例:
foo(const std::vector<Object> & objectVec) {
...
foo1(const_cast<std::vector<Object> &>(objectVec));
}但是,我建议查看需要使用非常数向量的foo1的实际需求,因为您似乎表示所有感兴趣的都是修改Object实例本身。
https://stackoverflow.com/questions/415199
复制相似问题