给定这些值类别时,std :: pair调用哪个构造函数?

时间:2018-01-10 21:01:37

标签: c++ c++11

我正在查看std::pair constructors,并注意到当我传入以下示例时,std::unique_ptr上的移动有效,但std::string无法移动。

std::string my_str = std::string("Hello World!");
auto my_smartp = std::make_unique<const std::string>();

const std::string &my_str_ref = my_str;

// my_str_ref is fine, no move
// my_smartp is fine, no move

auto pair = std::pair<std::string, std::unique_ptr<const std::string>>(my_str_ref, std::move(my_smartp));

// my_str_ref is fine and was not moved
// my_smartp is has been moved to the std::pair

这对我没有意义,因为我能看到的唯一有效的构造函数是(2),传入两个const引用,据我所知,它不应该触发任何移动。要么它们都作为临时U1&&U2&&传递,要么它们都作为常量引用传递const T1&const T2&

如果实施有所不同,我正在使用最新的铿锵声。

1 个答案:

答案 0 :(得分:1)

您正在调用第3.个构造函数

template< class U1, class U2 >
pair( U1&& x, U2&& y );

U&安培;&安培;是转发引用,可以绑定到:lvalues和rvalues。

my_str_ref是左值

std::move(my_smartp)是右值。

U1推导为std :: string&amp;。 x是左值引用:std :: string&amp; - 所以这里复制构造被称为。

U2推导为std::unique_ptr<const std::string>. y是左值ref:std::unqiue_ptr<const std::string>&&

所以pair.first从my_str_ref获得copy-construct,pair.second从my_smarp获取移动