小编Jan*_*Jan的帖子

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

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

这涉及相当古老的遗留代码;使用容器的现代选项将解决问题(无需告诉我!),但我想指出这一点,并询问在C ++ 17下行为是否是故意的,与C ++ 14及以下版本相反。 。

代码如下:

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

问题来自于以下事实:dosomething()将更改ArrayPointer,并且使用ArrayPointer的旧值代替新值(在C ++ 17中,而不在C ++ 14中)。解决方法是定义一个中间变量:

const int index=dosomething();
return ArrayPointer[index];
Run Code Online (Sandbox Code Playgroud)

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

PS:根据要求完成(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 …
Run Code Online (Sandbox Code Playgroud)

c++ visual-studio-2017

1
推荐指数
1
解决办法
46
查看次数

每个C++都可以使用匿名集合吗?

我正在尝试将一些Python listbrrehension像语法一样放入我的C++中.我正在使用Visual Studio 2013.

举个例子,假设我想模拟(python):for i in [1,5]: sum+=i 假设之前初始化的和为零.

到目前为止我能做的最好的是:

int a[]={1,5}, sum=0;
for each (int i in a) sum+=i;
Run Code Online (Sandbox Code Playgroud)

我会喜欢这样的东西:

for each (int i in {1,5}) sum+=i;
Run Code Online (Sandbox Code Playgroud)

但显然,这不会编译; 尝试在{1,5}处插入int或int []对我来说无济于事.

使用{1,5}来初始化矢量:std::vector<int>{1,5}有效,但有点刮风; 而且我不需要构造和销毁矢量的开销.

我错过了什么,或者这在C++ 11(以及可能是C++ 14)中是不可能的?

c++ c++11

0
推荐指数
1
解决办法
75
查看次数

标签 统计

c++ ×2

c++11 ×1

visual-studio-2017 ×1