小编Yiu*_*Fai的帖子

赋值运算符中的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++ ×1

evaluation ×1

function ×1