初始化 std::vector 替换为单大括号而不是双大括号

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

本文关键字:单大括 std vector 替换 初始化      更新时间:2023-10-16

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

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 那样使用列表初始化它:

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

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

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

代码使用聚合初始化。由于您没有任何字段,只有公共继承,因此聚合初始化的第一个参数将传递给祖先。这就是您需要双牙套的原因。

修复它的一种方法是从基类继承构造函数。所以你的类看起来像这样:

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

https://godbolt.org/z/qH6s_x

IMO 更好的解决方案是不定义类,而是定义类型的别名:

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

https://godbolt.org/z/Pt6sRQ

相关文章: