emplace_back 指向 const 对象的指针

Pointer to const object with emplace_back

我不明白什么时候可以在集合中使用 const variables/objects(尤其是 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_backpush_back 作为指针没有太大优势,但我使用 std::pair 来说明这对的另一部分可能是 big/costly.

具体来说,我的问题是为什么 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} 构造,而 someDataPtrconst MyData*.

同理,

MyData* p = someDataPtr; // fails
MyData m = someData;     // fine

作为解决方法,您可以将 someDataPtr 更改为 MyData*,或将 std::list 更改为 std::list<std::pair<int, const MyData*>>