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_back
比 push_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}
构造,而 someDataPtr
是 const MyData*
.
同理,
MyData* p = someDataPtr; // fails
MyData m = someData; // fine
作为解决方法,您可以将 someDataPtr
更改为 MyData*
,或将 std::list
更改为 std::list<std::pair<int, const MyData*>>
。
我不明白什么时候可以在集合中使用 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_back
比 push_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}
构造,而 someDataPtr
是 const MyData*
.
同理,
MyData* p = someDataPtr; // fails
MyData m = someData; // fine
作为解决方法,您可以将 someDataPtr
更改为 MyData*
,或将 std::list
更改为 std::list<std::pair<int, const MyData*>>
。