Точка последовательности неясность, неопределенное поведение?

Сегодня я натолкнулся на некоторый код, который демонстрирует различное поведение на 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 оценивают все возможное, прежде чем он попадет в буфер (..). Это имеет менее интуитивный смысл для меня.

Я предполагаю, что суть моего вопроса заключается в том, является ли это явным случаем неопределенного поведения.

Редактировать: Спасибо за разъяснение, и неопределенное поведение - термин, который я должен был использовать.

Ответы на вопрос(1)

Ваш ответ на вопрос