为什么不能显式调用构造函数?

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

我正在考虑创建一个构造函数来初始化封装的 std::array,并遇到了一个问题,即无法显式调用可复制类型(A 类)的构造函数。给定的代码中有两种情况。一个简单的例子:B 类的对象不能显式调用 A 类字段的复制构造函数。还有一个复杂的例子:std::array 的每个元素的初始化都需要隐式调用复制构造函数。如何避免隐式调用复制构造函数来初始化类成员?

#include <cstddef> // std::size_t
#include <utility> // std::forward
#include <array> // std::array

struct A {
  explicit A() = default;
  explicit A(A&) = default; // ERROR: used implicitly when initializing 'b'
};

struct B {
  //explicit B(A& a) : a_{a} {} // partially solves the problem, but cannot be defaulted
  A a_;
};

template<class T, std::size_t N>
struct C {
  template<class... Ts>
  explicit C(Ts&&... il) : values_{std::forward<Ts>(il)...} {} // how to use 'explicit A(A&)'?
  std::array<T, N> values_;
};

int main() {
  A a;
  B b{a}; // basic problem
  C<A, 3> c{a, a, a}; // extended problem
  return 0;
}
c++ initialization copy-constructor explicit-constructor default-copy-constructor
1个回答
0
投票

您可以使用指针来执行此操作:

struct B {
  std::unique_ptr<A> a_;
};

template<class T, std::size_t N>
struct C {
  template<class... Ts>
  explicit C(Ts&&... il) : values_{std::make_unique<A>(std::forward<Ts>(il))...} {}
  std::array<std::unique_ptr<T>, N> values_;
};

int main() {
  A a;
  B b{std::make_unique<A>(a)};
  C<A, 3> c{a, a, a};
}
© www.soinside.com 2019 - 2024. All rights reserved.