使用单花括号而不是双花括号初始化 std::vector 替换

Initializing a std::vector replacement with single curly braces instead of double curly braces

我有一个类似于下面的代码:

namespace mine
{
  template<class T>
  using _vector = std::vector<T, my_allocator<T>>;

  template<class T>
  class myvector : public _vector<T>{};
};

这在大多数情况下都可以用作我自己的 std::vector 替代品,但它不能像正常 std::vector:[=13= 那样用列表初始化它]

#include "myvector.h"

void foo(void)
{
  std::vector<int> vi = { 1, 2, 3 };
  mine::myvector<int> mvi = { { 1, 2, 3 } };
}

注意我使用了双花括号来编译它。那么,我在这里缺少什么?而且,更重要的是,我能做些什么来初始化 mine::myvector 就像我对普通 std::vector 所做的那样?

请注意,您的 class 没有定义或继承任何构造函数。 所以暂时我想知道你的代码是如何编译的。

您的代码使用 aggregate initialization。由于您没有任何字段只是 public 继承,聚合初始化的第一个参数被传递给祖先。这就是为什么你需要双括号的原因。

修复它的一种方法是从基数 class 到 inherit constructors。所以你的 class 看起来像这样:

  template<class T>
  class myvector : public _vector<T>{
      using _vector<T>::_vector;
  };

https://godbolt.org/z/qH6s_x

IMO 更好的解决方案是不定义 class 但为类型定义别名:

  template<class T>
  using myvector = _vector<T>;

https://godbolt.org/z/Pt6sRQ