gpt4 book ai didi

c++ - `std::array` 是默认构造的,而 `T` 不是默认构造的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:48:57 24 4
gpt4 key购买 nike

考虑下面的代码:

#include <array>

struct T
{
T() = delete;
};

int main()
{
std::array<T, 0> a;
a.size();
}

我们默认初始化一个大小为 0 的数组。由于没有元素,因此没有 T 的构造函数应该被调用。

然而,Clang仍然需要 T是默认可构造的,而GCC接受上面的代码。

请注意,如果我们将数组初始化更改为:

std::array<T, 0> a{};

Clang这次接受了。

是否非默认构造T防止 std::array<T, 0>从默认构造?

最佳答案

Since there's no elements, no constructor of T should be called.
Does non-default-constructible T prevent std::array<T, 0> from being default-constructible?

标准没有指定什么布局std::array<T, 0>应该让我们回答这个问题。零大小数组特化的行为如下:

[array.zero]

1 array shall provide support for the special case N == 0.
2 In the case that N == 0, begin() == end() == unique value. The return value of data() is unspecified.
3 The effect of calling front() or back() for a zero-sized array is undefined.
4 Member function swap() shall have a non-throwing exception specification.

您注意到的行为很可能是由于实现方面的差异造成的。

关于c++ - `std::array<T, 0>` 是默认构造的,而 `T` 不是默认构造的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49990400/

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