Hel*_*sel 6 c++ constructor delegates
我有一个B的构造函数,有一些默认参数,取决于其他参数:
struct A
{
int f();
A(const A&) = delete;
A(A&& );
// ....
};
struct B
{
B(A a, int n=a.f()) {//...}
// ...
};
Run Code Online (Sandbox Code Playgroud)
这显然无法以这种方式工作,所以我想使用委托构造函数:
struct B
{
B(A a, int n) {//...}
B(A a): B(a, a.f()) {}
};
Run Code Online (Sandbox Code Playgroud)
但是,这也不起作用,因为删除了A的复制构造函数.所以我需要类似的东西
struct B
{
B(A a, int n) {//...}
B(A a): B(std::move(a), a.f()) {}
};
Run Code Online (Sandbox Code Playgroud)
据我所知,不能保证在std :: move之前评估af(),因此结果是未定义的.是否有可能在std :: move之前获取af()的值,或者我应该更好地编写两个单独的构造函数?
对此有更多可能的解决方案。
最简单的方法是创建a一个指针:
struct B
{
B(A* a, int n) {...}
B(A* a): B(a, a->f()) {}
};
Run Code Online (Sandbox Code Playgroud)更复杂的方法是尝试做a参考:
struct B
{
B(A& a, int n) {...}
B(A& a): B(a, a.f()) {}
};
Run Code Online (Sandbox Code Playgroud)我不会建议这个解决方案。指针是一种更简洁的方法。
编辑:
通过实用程序库中的 std::move
struct B
{
A&& a:
int n:
B(A&& a, int n): a(std::move(a)), n(n) {...}
B(A&& a): B(std::move(a), a.f()) {...}
};
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |