gpt4 book ai didi

数组 : why cannot use an array defined by indirectly computed const var in function begin(array)? 的 C++ 指针

转载 作者:行者123 更新时间:2023-11-30 02:16:24 27 4
gpt4 key购买 nike

文本中的错误消息:

我正在学习 C++ Primer 这本书,在为一个练习编写答案时遇到了下面列出的问题:

#include<iostream>
#include<vector>

using namespace std;

int main() {
int i = 3;
const int ci = 3;
size_t si = 3;
const size_t csi = 3;
int ia[i];
int cia[ci];
int sia[si];
int csia[csi];
int another_a[] = {1,2,3};

int *pi = begin(ia); // error here
// no instance of overloaded function "begin" matches the argument list --
// argument types are: (int [i])
int *pci = begin(cia);
int *psi = begin(sia); // error here
// no instance of overloaded function "begin" matches the argument list --
// argument types are: (int [si])
int *pcsi = begin(csia);
int *p_ano = begin(another_a);

vector<int> v = {1,3,4};
const int m = v.size();
const size_t n = v.size();
int ma[m];
int na[n];
int *pm = begin(ma); // error here
// no instance of overloaded function "begin" matches the argument list --
// argument types are: (int [m])
int *pn = begin(na); // error here
// no instance of overloaded function "begin" matches the argument list --
// argument types are: (int [n])

system("pause");
return 0;
}

我可以理解前两个错误是因为这两个数组没有使用常量变量定义。但是为什么最后两个,即使我已经把vector的大小转换成常量了,编译器还是报错呢?

enter image description here

我对此很困惑,无论是否有效,如果您能友好地回答或讨论,我将不胜感激。

最佳答案

首先,您正在使用编译器扩展,稍后会详细介绍。

为您工作的标准begin 重载是一个模板,它接受对大小为常量表达式的数组的引用。简而言之,常量表达式是编译器可以在编译期间计算并知道其值的那些表达式。

用常量表达式初始化的常量整数,如 const int ci = 3;,可用于需要常量表达式的任何地方。所以 ci 就所有意图而言都是一个常量表达式本身(等于 3)。

现代 C++ 有一种方法可以使此类变量作为预期的常量表达式脱颖而出,它是 constexpr 说明符。所以你可以这样定义 ci:

constexpr int ci = 3;

它与您的原始代码完全一样。但同样不适用于 const int m = v.size();。因为 constexpr 需要一个真正的常量表达式作为初始化器,这与 const 不同。对于 const 变量不一定是常量表达式。它可以只是一个您无法修改的运行时变量。 m 就是这种情况。

因为m不是常量表达式,所以你定义的是一个变长数组。有时作为扩展由 C++ 编译器引入的 C 功能。而且它不与 std::begin 模板结合,该模板期望数组范围是一个常量表达式

关于数组 : why cannot use an array defined by indirectly computed const var in function begin(array)? 的 C++ 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54978853/

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