c++ - 使用 emplace_back 指向 const 对象的指针

标签 c++ stl constants c++17 emplace

我不明白什么时候我们可以在集合中使用 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} 构造而someDataPtrconst MyData* .

同样的逻辑下,

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

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

关于c++ - 使用 emplace_back 指向 const 对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70121565/

相关文章:

c++ - ZeroMQ REQ/REP 性能

c++ - Boost 测试使用变体

c++ - OpenGL 和 STL?

无法摆脱 "this decimal constant is unsigned only in ISO C90"警告

c++ - 用C++将域名从DNS格式转换为NetBIOS格式

c++ - 缓存方法结果时如何处理常量?

c++ - ifstream::ifstream 可以读取的最大文件大小是多少

c++ - 我无法制作 list<int> 数组的 unique_ptr

C: const vs no const ..这是怎么编译的?

c++ - 将值与结构成员进行比较的问题