gpt4 book ai didi

c++ - 为什么 std::array x 不是零初始化但 std::array x = std::array() 似乎是?

转载 作者:IT老高 更新时间:2023-10-28 22:38:39 27 4
gpt4 key购买 nike

我刚刚问了两个关于数组和值初始化的问题 herehere .但是有了这段代码,我迷路了:

#include <iostream>
#include <iomanip>
#include <array>

template <class T, class U = decltype(std::declval<T>().at(0))>
inline U f1(const unsigned int i)
{T x; return x.at(i);}

template <class T, class U = decltype(std::declval<T>().at(0))>
inline U f2(const unsigned int i)
{T x = T(); return x.at(i);}

int main()
{
static const unsigned int n = 10;
static const unsigned int w = 20;
for (unsigned int i = 0; i < n; ++i) {
std::cout<<std::setw(w)<<i;
std::cout<<std::setw(w)<<f1<std::array<int, n>>(i);
std::cout<<std::setw(w)<<f2<std::array<int, n>>(i);
std::cout<<std::setw(w)<<std::endl;
}
return 0;
}

正如预期的那样,f1返回任意值,因为它的值不是零初始化的。但是f2似乎只返回零值:

                   0                   0                   0
1 61 0
2 0 0
3 0 0
4 297887440 0
5 32767 0
6 4196848 0
7 0 0
8 297887664 0
9 32767 0

我个人认为 f2将创建一个具有任意值的数组并将其复制/移动到 x .但似乎并非如此。

所以,我有两个问题:

  • 为什么?
  • 做 C++11 std::array<T, N>和 C 风格 T[N]在这种情况下有同样的行为吗?

最佳答案

使用 {}() 作为初始化器,如果没有 =,则会导致值初始化。对于具有隐式声明构造函数的类型,值初始化实现零初始化,顾名思义,将每个原始元素设置为 0。这发生在构造函数可能运行之前,但在这种情况下,构造函数什么都不做。

因为构造函数什么都不做(它是微不足道的),所以有可能看到未初始化的数据。

对于 C 样式的数组,如果使用 = {} 而不是 = T(),则行为类似,因为后者是非法的。 T() 会要求将临时数组对象分配给命名对象,但无法分配数组。另一方面,= {} 将花括号初始化器列表分配给数组,而花括号初始化器列表是一种特殊的语法结构,既不是表达式也不是对象。

关于c++ - 为什么 std::array<int, 10> x 不是零初始化但 std::array<int, 10> x = std::array<int, 10>() 似乎是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18296274/

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