我正在查看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&
。
如果实施有所不同,我正在使用最新的铿锵声。
答案 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获取移动