使用户构造函数的行为类似于聚合初始化

问题描述 投票:0回答:1

我写了以下玩具示例

#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
聚合初始化的构造函数?

c++ constructor aggregate-initialization
1个回答
0
投票

这里常用的技巧是使用可以 converts 到所需类型的类型:

struct C {
    A a;
    template<class T>
    C(T &&t): a(std::forward<T>(t)) {}
};
struct preA {
    operator A()() {return {};}
};

C c(preA{});
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.