gpt4 book ai didi

c++ - 为什么来自匿名对象的 std::pair 复制该对象而不是移动?

转载 作者:行者123 更新时间:2023-12-02 11:24:29 26 4
gpt4 key购买 nike

我试着做 std::pair用这种风格:

#include <iostream>

struct A {
A() noexcept {
std::cout << "Created\n";
}
A(const A&) noexcept {
std::cout << "Copy\n";
}
A(A&&) noexcept {
std::cout << "Move\n";
}
};

int main() {
std::pair<A, A> a{ {},{} };
return 0;
}
并得到这样的输出:
Created
Created
Copy
Copy
代替
Created 
Created
Move
Move
但是如果我定义我的匿名对象类型(例如 std::pair<A, A> a{A{}, A{}} )
或使用 std::make_pair<A, A>({}, {})我得到正确的结果。 std::pair构造函数必须使用 std::forward<U1>std::forward<U2>初始化对象,因此我认为我的配对使用了错误的构造函数。为什么?

最佳答案

方式有问题 std::pair被定义为。我什至会说这是标准中的一个小缺陷。
它有两个可以在这里使用的构造函数:

  • pair(const T1 &x, const T2 &y); ,其中 T1 , T2pair 的模板参数.
  • template <class U1, class U2> pair(U1 &&x, U2 &&y);

  • 如果你这样做 std::pair<A, A> a{A{}, A{}}); ,然后选择第二个构造函数,一切都很好。
    但如果你这样做 std::pair<A, A> a{{}, {}}; ,编译器不能使用第二个构造函数,因为它不能推导出 U1 , U2 , 因为 {}本身没有类型。所以第一个构造函数被使用,你得到一个拷贝。
    要使其正常工作, std::pair应该有一个额外的非模板构造函数 pair(T1 &&, T2 &&) ,还有两个额外的构造函数: pair(const T1 &, T2 &&)pair(T1 &&, const T2 &) .

    关于c++ - 为什么来自匿名对象的 std::pair 复制该对象而不是移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64527951/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com