gpt4 book ai didi

VS 中的 C++ 17 导致变量(重新)评估错误,这在 C++14 中不存在

转载 作者:行者123 更新时间:2023-11-30 01:02:32 25 4
gpt4 key购买 nike

使用返回整数和(可能)修改基指针的函数会导致在返回数组的预期成员时出现意外行为。

这涉及相当古老的遗留代码;使用容器的现代选项将解决问题(不需要告诉我,拜托!),但我想指出这一点并询问在 C++17 下该行为是否是故意的,与 C++14 及之前的 C++14 形成对比.

代码如下:

// dosomething() returns an integer.
// ArrayPointer is a class member
somememberfunction(args)
{
...
return ArrayPointer[dosomething()];
}

问题是由于 dosomething() 会改变 ArrayPointer 并且使用 ArrayPointer 的旧值而不是新值(在 C++17 下,而不是在 C++14 下)。解决方法是定义一个中间变量:

const int index=dosomething();
return ArrayPointer[index];

问题是:是否有解释(取决于标准),或者这是否被视为错误,而不仅仅是我认为的不良行为?

PS: complet(er C) 代码,按要求,注意非必要部分,省略变量声明:

struct BKPRArray    // struct for applying meteocorrection
{
double *findprarray(const char *bks)
{
// check earlier allocations (NR)
for (int n = 0; n < arrays; n++)
if (!_stricmp(this->bk[n], bks))
{
if (!PRarray[n]) PRarray[n] = (NUMTYPE*)calloc(FL_alloced, sizeof(NUMTYPE));
return PRarray[n];
}
// combined return statement will fail under C++17 by using the old value of PRarray.
// This MAY be caused by order of evaluation, rule 17: https://en.cppreference.com/w/cpp/language/eval_order
// allocate and prepare (preparation code omitted) a new array.
//return PRarray[addarray(bks, defaultMeteoCorrection)];
const auto index = addarray(bks, defaultMeteoCorrection);
return PRarray[index]; // zet factor op +20%, want bk niet specifiek vermeld bij input.
}
....
int addarray(const char *bks, const double fact = defaultMeteoCorrection)
{
PRarray = (double**)realloc(PRarray, (arrays + 1) * sizeof(*PRarray));
if (FL_alloced) PRarray[arrays] = (NUMTYPE*)calloc(FL_alloced, sizeof(NUMTYPE));
else PRarray[arrays] = NULL;
...
return arrays++;
}
....
private:
double **PRarray; // etc.
};

最佳答案

ArrayPointerdosomething() 之间的计算顺序在 C++17 之前未指定。 (所以它在 C++14 中“工作”的事实是 “偶然”)。

在 C++17 中,ArrayPointer 应该在 dosomething() 之前求值。

参见 Order of evaluation , 第 17 条。

关于VS 中的 C++ 17 导致变量(重新)评估错误,这在 C++14 中不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55857031/

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