use*_*147 9 c++ initialization aggregate-initialization c++20
考虑以下代码:
struct A
{
// No data members
//...
};
template<typename T, size_t N>
struct B : A
{
T data[N];
}
Run Code Online (Sandbox Code Playgroud)
这就是你必须如何初始化 B:B<int, 3> b = { {}, {1, 2, 3} };
我想避免基类不必要的空 {}。Jarod42 here提出了一个解决方案,但是,它不适用于元素默认初始化:B<int, 3> b = {1, 2, 3};很好,但B<int, 3> b = {1};不是:b.data[1]并且b.data[2]没有默认初始化为 0,并且会发生编译器错误。有什么方法(或者 C++20 会有)从构造中“隐藏”基类?
最简单的解决方案是添加一个可变参数构造函数:
struct A { };
template<typename T, std::size_t N>
struct B : A {
template<class... Ts, typename = std::enable_if_t<
(std::is_convertible_v<Ts, T> && ...)>>
B(Ts&&... args) : data{std::forward<Ts>(args)...} {}
T data[N];
};
void foo() {
B<int, 3> b1 = {1, 2, 3};
B<int, 3> b2 = {1};
}
Run Code Online (Sandbox Code Playgroud)
如果在{...}初始值设定项列表中提供的元素少于N,则数组中的其余元素data将被值初始化为T()。
从 C++20 开始,您可以在聚合初始化中使用指定的初始值设定项。
B<int, 3> b = { .data {1} }; // initialize b.data with {1},
// b.data[0] is 1, b.data[1] and b.data[2] would be 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
445 次 |
| 最近记录: |