今天我发现一些代码在clang++(3.7-git),g ++(4.9.2)和Visual Studio 2013上表现出不同的行为。经过一些简化,我得到了这个片段,突显了问题:
#include <iostream>
using namespace std;
int len_ = -1;
char *buffer(int size_)
{
cout << "len_: " << len_ << endl;
return new char[size_];
}
int main(int argc, char *argv[])
{
int len = 10;
buffer(len+1)[len_ = len] = '\0';
cout << "len_: " << len_ << endl;
}
g++ (4.9.2) 给出如下输出:
len_: -1
len_: 10
所以,g++首先计算buffer的参数,然后计算buffer(..)本身,最后计算数组运算符的索引参数。直观地讲,这对我来说是有意义的。
clang(3.7-git)和Visual Studio 2013均给出:
len_: 10
len_: 10
我想clang和VS2013会在降低到buffer(...)之前评估所有可能的情况。对我来说,这意义不太直观。
我猜我的问题的要点是,这是否是未定义行为的明显情况。
编辑:感谢澄清,应该使用未指定行为这个术语。