gpt4 book ai didi

c++ - 将 const* 存储在 const vector 中

转载 作者:行者123 更新时间:2023-12-02 03:17:55 28 4
gpt4 key购买 nike

我必须处理的相关接口(interface)代码由两个函数组成,一个函数检索对象,另一个函数必须将对象作为 vector 提交。问题是,检索函数返回 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*> 可以产生非常量指针,因为我对指针常量的理解不正确。

最佳答案

您误解了文档/打字规则。如果您有 T = Object* ,那么 const T 不是 const Object* 而是 Object* const 。这就是 C 和 C++ 的工作原理。

因此,您关于“无法从 const vector<Object*> 获取可变对象”的断言是错误的。您不能做的是修改 vector 或元素的值(即更改指针)。但是访问器返回对 Object* const 的引用,因此仍然可以修改指向的对象:

void foo(const std::vector<int*>& v)
{
(*v[0])++; // Increments the integer pointed to by the first vector element.
}

https://godbolt.org/z/HGIb20

这只是因为 const 不具有传递性。这是另一个例子:

struct X
{
int* y;
};

void foo(const X& x)
{
(*x.y)++;
}

https://godbolt.org/z/NmCwGt

<小时/>

鉴于此,您拥有的界面不允许您执行您想要执行的操作。你只得到了指向不可变对象(immutable对象)的指针,但应该传递指向可变对象的指针(submitObjects函数只 promise 不修改容器,但它保留修改对象的权利)。这根本不可能。

const_cast 可能是一个有效选项如果(这是一个非常重要的如果!)您 100% 知道这些对象实际上无论在何处创建,都没有声明为 const 。但这既违背了界面的要点,又是一种极其脆弱、老套的方法,在这种情况下您甚至不应该考虑。

关于c++ - 将 const* 存储在 const vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58505901/

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