gpt4 book ai didi

c++ - 为什么数组 的元素的默认初始化需要 C++14?

转载 作者:太空狗 更新时间:2023-10-29 23:23:53 26 4
gpt4 key购买 nike

考虑以下 MWE ( https://godbolt.org/g/aydjpW ):

#include <cstdlib>
#include <array>
template<size_t N> constexpr std::array<void*, N> empty_array{};

我的目标是拥有一个大小为 N 的数组其中每个元素都是默认初始化的(在这个 MWE 的情况下,一个 nullptr )。 g++ 5.4.0 与 -std=c++11提示

variable templates only available with -std=c++14 or -std=gnu++14

我不明白为什么。根据http://en.cppreference.com/w/cpp/container/array , array<T, N>自 C++11 和隐式声明的构造函数以来存在

initializes the array following the rules of aggregate initialization

点击聚合初始化描述的链接 http://en.cppreference.com/w/cpp/language/aggregate_initialization , 它说

If the number of initializer clauses is less than the number of members or initializer list is completely empty, the remaining members are value-initialized.

因此,我的假设是我上面的代码是有效的 C++11。我在这里遗漏了什么变量模板以某种方式涉及,这需要 C++14?

最佳答案

声明一个包含 5 个元素的数组:

constexpr std::array<void*, 5> empty_array{};

要声明一个包含 10 个元素的数组:

constexpr std::array<void*, 10> empty_array{};

要声明 N 不固定的 N 元素数组,您需要使用一个模板,该模板可以为不同的 N 值实例化:

// A variable of type std::array<void*, N> where N is not fixed yet:
template<size_t N> constexpr std::array<void*, N> empty_array{};

// Then given a function like this:
void do_something(const std::array<void*, 5>&);

// You use the variable like this, by giving the value of N:
void some_function() {
do_something(empty_array<5>);
}

但这是一个变量模板,它是 C++14 中的一个新特性。你不能在 C++11 中这样做,所以你会得到编译器错误。

要么使用 C++14,要么做类似的事情:

// An alias template defining a _type_ of array with no fixed N:
template<std::size_t N>
using voidptr_array = std::array<void*, N>;

constexpr voidptr_array<5> empty_array_of_5{};
constexpr voidptr_array<10> empty_array_of_10{};

void do_something(const std::array<void*, 5>&);

void some_function() {
do_something(empty_array_of_5);
}

这个别名模板定义了一个以 N 作为参数的类型,而不是一个以 N 作为参数的变量。您仍然需要定义该类型的变量,例如 empty_array_of_5empty_array_of_10

关于c++ - 为什么数组 <T*, N> 的元素的默认初始化需要 C++14?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48664461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com