如何初始化一系列不可移动,不可复制的对象?

And*_*ard 5 c++ constructor compile-time

假设我有一种既不可移动也不可复制的类型:

struct foo
{
  explicit foo( size_t ){}
  ~foo(){}

  foo( foo const & ) = delete;
  foo( foo && ) = delete;
  foo& operator=( foo const & ) = delete;
  foo& operator=( foo & ) = delete;
};
Run Code Online (Sandbox Code Playgroud)

现在给出一个在编译时已知的数字(称为N),有没有什么方法可以在堆栈上创建这些序列,每个都用数字0到N-1初始化?我会满足于C数组foo[N],一个std::array< foo, N >,或者甚至是std::tuple某种形式的.

我想避免的是写出来:

foo f0( 0 ), f1( 1 ), ... fNminus1( N-1 );
Run Code Online (Sandbox Code Playgroud)

当感觉这是编译器应该能够为我做的事情.我能想到的最好的就是使用boost::optional.

boost::optional< foo > f[N];

for( size_t i = 0U; i < N; ++i )
  f[i] = boost::in_place( i );
Run Code Online (Sandbox Code Playgroud)

但是,即使在编译时可以获得所有必需的信息,这依赖于运行时逻辑.另外,我留下的东西就像一个指针数组.

Ben*_*ley 3

// create a type with the proper alignment
typedef std::aligned_storage<sizeof(foo), std::alignment_of<foo>::value>::type buffer_type;

const int N = 10;
// create an array of uninitialized raw data
buffer_type storage_buffer[N];

// initialize each foo object with placement new
for (size_t i=0; i<N; ++i)
    new (storage_buffer + i) foo(i);

foo * fp = (foo*)(&storage_buffer);
// access your foo objects via fp


// you must manually call the destructor of each object
for (size_t i=0; i<N; ++i)
    fp[i].~foo();
Run Code Online (Sandbox Code Playgroud)

如果这看起来很麻烦,确实如此。但是您可以轻松地将该功能封装在一个类中。