我不明白什么时候我们可以在集合中使用 const 变量/对象(特别是使用 emplace
)。下面的代码可以直接处理 const 对象,但不能使用指向 const 对象的指针。
#include <list>
class MyData { };
int main() {
std::list<std::pair<int, MyData>> collection1{};
std::list<std::pair<int, MyData*>> collection2{};
const MyData someData{};
const MyData* someDataPtr = &someData;
collection1.emplace_back(1, someData);
//collection2.emplace_back(1, someDataPtr); //Messy template error!
}
我认为使用 emplace_back
相对于 push_back
指针没有太大优势,但我使用 std::pair 来说明该对的其他部分可以是大的/昂贵的东西。
具体来说,我的问题是为什么 emplace_back
可以使用 const 对象,但不能使用指向 const 对象的指针?有没有合理的方法来实现后者?
对于任何想了解用例的人,我有一个成员函数,它传递该对的组成部分,进行一些处理(但不应更改任何数据),然后将该对放入集合中。像这样的东西:
void add_to_schedule(const int id, const MyData* myData) {
//some processing
this->collection.emplace_back(id, myData);
}
最佳答案
const MyData*
无法转换为MyData*
隐含地。这意味着std::pair<int, MyData*>
无法从 {1, someDataPtr}
构造而someDataPtr
是 const MyData*
.
同样的逻辑下,
MyData* p = someDataPtr; // fails
MyData m = someData; // fine
作为解决方法,您可以更改 someDataPtr
至MyData*
,或更改std::list
至std::list<std::pair<int, const MyData*>>
.
关于c++ - 使用 emplace_back 指向 const 对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70121565/