Сегодня я столкнулся с некоторым кодом, который демонстрирует различное поведение на 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++ оценивает аргумент в буфере, а затем сам буфер (..) и после этого вычисляет аргумент индекса оператору массива. Интуитивно это имеет смысл для меня.
clang (3.7- git) и Visual Studio 2013 дают:
len_: 10
len_: 10
Я полагаю, что clang и VS2013 оценивают все возможное до того, как он распадается на буфер (..). Это делает меня менее интуитивным.
Я предполагаю, что суть моего вопроса в том, является ли это явным примером поведения undefined.
Изменить: спасибо за очистку этого, а неуказанное поведение - это термин, который я должен был использовать.