【问题标题】:Error while trying to use const int std::array [duplicate]尝试使用 const int std::array 时出错 [重复]
【发布时间】:2018-08-28 05:20:45
【问题描述】:

为什么当我尝试使用 const int std::array 时出现以下错误? 我必须将错误消息中的“

#include <array>
#include <iostream>

using namespace std;

int main() {
    array<const int, 4> vals;

    return 0;
}

test.cpp:在函数“int main()”中:

test.cpp:7:22: 错误:使用已删除的函数'std::array::array()'

数组 vals; ^~~~

在 test.cpp:1:0 包含的文件中: /usr/include/c++/7.3.0/array:94:12:注意:'std::array::array()' 被隐式删除,因为默认定义格式不正确: 结构数组 ^~~~~

/usr/include/c++/7.3.0/array:94:12: 错误:‘struct std::array’中未初始化的 const 成员

/usr/include/c++/7.3.0/array:110:56: 注意:'const int std::array::_M_elems [4]' 应该被初始化 类型名 _AT_Type::_Type _M_elems; ^~~~~~~~

【问题讨论】:

  • 我认为最好将错误消息格式化为代码。至少,固定宽度的字体会使^~~~ 部分更好地对齐。
  • 那就初始化吧。
  • const int 使 int 无法更改(仅在初始化时)。在这里,您将无法在初始化后更改 vals,这个数组是无用的。要么删除 const,要么初始化它 array&lt;const int, 4&gt; vals = {1,2,3,4}
  • 你真的应该避免using namespace std - 这是一个坏习惯,当你不期待它时can silently change the meaning of your program。习惯于使用命名空间前缀(std 故意很短),或将只是您需要的名称 导入到最小合理范围

标签: c++ arrays c++11 initialization constants


【解决方案1】:

您将如何将数组值分配给const int 元素?您应该在声明期间初始化它们。

#include <array>

using namespace std;

int main() {
    array<const int, 4> vals{1, 2, 3, 4};

    return 0;
}

没有任何初始化,您的示例类似于无效的 const 声明:

const int a;

由于std::array本身不能更新,所以我想下面的代码会更容易理解。

#include <array>

using namespace std;

int main() {
    const array<int, 4> vals{1, 2, 3, 4};

    return 0;
}

【讨论】:

  • 可能数组在只写内存中。
【解决方案2】:

这是由于常量对象在定义时必须初始化。但是使用此声明

array<const int, 4> vals;

您没有提供初始化程序。

考虑以下程序

#include <iostream>
#include <array>

int main() 
{
    int x = 42;
    std::array<const int, 4> vals = { { 1, 2, 3, 4 } };

    for ( int x : vals ) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

它的输出是

1 2 3 4

【讨论】:

  • 额外大括号的作用是什么?
  • 为什么要加倍 { { } } 来初始化数组?
  • @KillzoneKid 因为早期的一些编译器不允许在没有额外大括号的情况下以这种方式初始化聚合。
  • @VladfromMoscow 早于 C++11 之前? std::array 自 C++11 以来就存在,所以我认为可以安全地假设单大括号在此代码的任何地方都可以正常工作。
  • @KillzoneKid Early 表示 C++11 何时被采用或最终采用之前。
猜你喜欢
  • 1970-01-01
  • 2016-05-23
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多