【发布时间】:2021-02-08 04:02:38
【问题描述】:
我尝试用这种风格制作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> 来初始化对象,因此我认为我的对使用了错误的构造函数。为什么?
【问题讨论】:
-
即使使用 C++20 它仍然调用复制 ctor
-
您使用的是哪个编译器?哪个版本的编译器?构建时将哪些标志和选项传递给编译器?
-
我没有使用任何优化,我在clang和msvc上编译(std::c++17都)