我写了以下玩具示例
#include <iostream>
using namespace std;
struct A {
A() { cerr << "default" << endl; }
A(const A &a) { cerr << "copy" << endl; }
A(A &&a) { cerr << "move" << endl; }
};
struct B {
A a;
};
struct C {
A a;
C(A a): a(a) {}
};
int main() {
B b {A()};
cerr << "=======" << endl;
C c {A()};
return 0;
}
编译并运行它给出:
default
=======
default
copy
我们可以看到
C
的构造函数创建了一个副本,而 B
的构造不需要副本。
我无法通过在 struct
B
中定义我自己的构造函数来重现 C
的行为。例如,将 C(A a): a(a) {}
替换为 C(A a): a(forward<A>(a)) {}
会创建一个移动。
有没有办法创建一个模仿
B
聚合初始化的构造函数?
这里常用的技巧是使用可以 converts 到所需类型的类型:
struct C {
A a;
template<class T>
C(T &&t): a(std::forward<T>(t)) {}
};
struct preA {
operator A()() {return {};}
};
C c(preA{});