是否可以将unique_ptr存储在QPairs的QList中?

时间:2015-03-26 11:08:10

标签: c++ qt c++11 stl unique-ptr

为了避免大量不必要的复制,我试图将unique_ptr存储在对列表中。我正在使用一个简单的类Test,它接受一个QString;

我正在使用VS2013和Qt5.4

using std::unique_ptr;

QList<QPair<unique_ptr<Test>, unique_ptr<Test>>> list;

auto a = std::make_unique<Test>("a");
auto b = std::make_unique<Test>("b");

// First make a pair
auto pair = qMakePair(std::move(a), std::move(b));      // Fails
// Error C2280 - attempting to reference a deleted function

由于失败,我尝试了:

QList<std::pair<unique_ptr<Test>, unique_ptr<Test>>> list;
auto pair = std::make_pair(std::move(a), std::move(b)); // Succes
list.append(std::move(pair)); // Fails
// Error C2280 - attempting to reference a deleted function

由于失败,我完全改为STL包含:

std::list<std::pair<unique_ptr<Test>, unique_ptr<Test>>> list;
auto pair = make_pair(std::move(a), std::move(b)); // Succes
list.push_back(std::move(pair)); // Succes

这很有效。我的结论是否正确,这些Qt容器不支持移动语义,我必须使用STL?

1 个答案:

答案 0 :(得分:0)

std::unique_ptr是不可复制的,因此请不要使用Qt容器。

Qt容器在std :: move(甚至std :: string)之前创建的方式变成了一件事情。

Qt6中可能会有更好的支持。可以打破一些东西以更好地与现代C ++集成。

OTOH,如果您不希望使用std容器,也可以使用它们,除非您有一些特定的用例?