相关疑难解决方法(0)

赋值运算符中的C++函数求值顺序

int& foo() {
   printf("Foo\n");
   static int a;
   return a;
}

int bar() {
   printf("Bar\n");
   return 1;
}

void main() {
   foo() = bar();
}
Run Code Online (Sandbox Code Playgroud)

我不确定应该首先评估哪一个.

我在VC中尝试过首先执行bar函数.但是,在g ++编译器(FreeBSD)中,它首先给出了foo函数的评估.

很多有趣的问题来自上面的问题,假设我有一个动态数组(std :: vector)

std::vector<int> vec;

int foobar() {
   vec.resize( vec.size() + 1 );
   return vec.size();
}

void main() {
   vec.resize( 2 );
   vec[0] = foobar();
}
Run Code Online (Sandbox Code Playgroud)

根据以前的结果,vc计算foobar(),然后执行向量运算符[].在这种情况下没有问题.但是,对于gcc,由于正在评估vec [0]并且foobar()函数可能导致更改数组的内部指针.执行foobar()后,vec [0]可以无效.

是否意味着我们需要将代码分开

void main() {
   vec.resize( 2 );
   int a = foobar();
   vec[0] = a;
}
Run Code Online (Sandbox Code Playgroud)

c++ evaluation function

8
推荐指数
2
解决办法
2690
查看次数

是否将地图大小作为值插入到地图未定义行为中?

编辑:这个问题不应该被关闭,如果你查看答案,你会发现它们完全不同(旧问题没有提到 C++17)。

我正在阅读一篇 PVS博客文章,他们提到了以下错误。

(减少)

std::map<int,int> m;
m[7]=5;
auto val = 15;
if (!m.contains(val)){
    m[val] = m.size(); // bug here
}
Run Code Online (Sandbox Code Playgroud)

根据博客文章,这是错误的。我一直认为 operator [] 对 map 的调用是一个函数调用,所以 .size() 在 [] 之前被排序,因为函数充当序列点。

那么为什么这是一个错误呢?

注意:我知道从 C++11 开始就不存在序列点,但我使用它们是因为新的措辞对我来说更难理解。

c++ sequence-points unspecified-behavior

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