Punto de secuencia ambigüedad, comportamiento indefinido?

Hoy me encontré con un código que muestra un comportamiento diferente en clang ++ (3.7-git), g ++ (4.9.2) y Visual Studio 2013. Después de alguna reducción, encontré este fragmento que resalta el problema:

#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) da este resultado:

len_: -1
len_: 10

Por lo tanto, g ++ evalúa el argumento en el búfer, luego el búfer (..) en sí y luego evalúa el argumento del índice en el operador de matriz. Intuitivamente, esto tiene sentido para mí.

clang (3.7-git) y Visual Studio 2013 dan:

len_: 10
len_: 10

Supongo que clang y VS2013 evalúan todo lo posible antes de que se convierta en buffer (..). Esto tiene menos sentido intuitivo para mí.

Supongo que la esencia de mi pregunta es si este es un caso claro de comportamiento indefinido.

Editar: Gracias por aclarar esto, y un comportamiento no especificado es el término que debería haber usado.

Respuestas a la pregunta(2)

Su respuesta a la pregunta