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++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 开始就不存在序列点,但我使用它们是因为新的措辞对我来说更难理解。