【发布时间】:2020-02-18 16:48:23
【问题描述】:
我必须处理的相关接口代码包含两个函数,一个是检索对象,另一个是我必须将对象作为向量提交。问题是,检索函数返回const Object*,但提交函数需要const vector<Object*>。
我知道这可以通过 const_cast<Object*> 解决,但有没有其他更简洁的方法?
下面是演示问题的代码:
#include <vector>
//////////// REPRESENTATIVE INTERFACE IMPLEMENTATION, DO NOT TOUCH ///////
struct Object{};
class Interface{
public:
size_t getNumObjects() const {return 10;}
const Object* getObject(size_t index) const {return nullptr;}
};
const Interface interface;
void submitObjects(const std::vector<Object*> &objects);
//////////////////////////////////////////////////////////////////////
// Task: take all objects from 'interface' and submit them to 'submitObjects'.
int main(){
std::vector<const Object*> objects;
for(size_t i = 0; i < interface.getNumObjects(); i++){
const Object* object = interface.getObject(i);
objects.push_back(object);
}
submitObjects(objects); // ERROR: no known conversion from 'vector<const Object *>' to 'const vector<Object *>'
return 0;
}
我能想出解决这个问题的唯一方法是使objects 成为std::vector<Object*> 并插入带有objects.push_back(const_cast<Object*>(object)); 的对象,但我觉得必须有更好的解决方案。
感谢任何想法。
更多背景信息为什么这是一个有效的问题:
const vector<Object*> 只能传递 const Object*,正如其所有 getter 重载所示,如下所示:https://de.cppreference.com/w/cpp/container/vector/operator_at
因此,vector<const Object*> 几乎从不在接口中使用。因此,将大量const Object* 组合成一个大const vector<Object*> 的想法是一个有效的概念,但如果没有const_cast,似乎无法构建。
编辑:以上陈述不正确,感谢澄清。
const std::vector<Object*> 可以产生非常量指针,因为我对指针常量的理解不正确。
【问题讨论】:
-
std::vector<Object*> const和std::vector<Object const*>是两个完全不同的野兽!在后者中,您可以更改向量的内容(添加/删除/替换),但不能修改指向的对象。在前者中,向量本身不能被修改——但是only适用于指针,而你可以修改指向的对象! -
@Finomnis 我很确定
const vector<Object*>给了你Object* const(即一个指向可变对象的const指针,它可以对应一个const Object*,即可变指针指向const对象)。 -
@Finomnis 您误解了文档/打字规则。如果你有
T = Object*,那么const T不是const Object*而是Object* const。 -
West-const-ing 的危险!多年来,我一直是一名东部居民。
-
@Everyone ...所以我是 const 指针符号的受害者吗?
标签: c++ c++11 vector c++14 constants