g ++ rejeita, clang ++ aceita: foo (x) ("bar") ("baz");

Alguém tevePerguntou no outro dia, por que algo compila com clang, mas não com gcc. Eu entendi intuitivamente o que estava acontecendo e fui capaz de ajudar a pessoa, mas isso me fez pensar - de acordo com o padrão, qual compilador estava correto? Aqui está uma versão resumida do código:

#include <iostream>
#include <string>

class foo
{
public:
    foo(const std::string& x):
        name(x)
    { }
    foo& operator()(const std::string& x)
    {
        std::cout << name << ": " << x << std::endl;
        return (*this);
    }
    std::string name;
};

int main()
{
    std::string x = "foo";
    foo(x)("bar")("baz");
    return 0;
}

Isso compila bem com o clang ++, mas o g ++ fornece o seguinte erro:

runme.cpp: In function ‘int main()’:
runme.cpp:21:11: error: conflicting declaration ‘foo x’
    foo(x)("bar")("baz");
        ^
runme.cpp:20:17: error: ‘x’ has a previous declaration as ‘std::string x’
    std::string x = "foo";

Se eu adicionar um par de parênteses na linha 21, o g ++ ficará feliz:

(foo(x))("bar")("baz");

Em outras palavras, o g ++ interpreta essa linha como:

foo x ("bar")("baz");

Acho que é um bug no g ++, mas, novamente, eu queria perguntar aos especialistas padrão, qual compilador entendeu errado?

PS: gcc-4.8.3, clang-3.5.1

questionAnswers(2)

yourAnswerToTheQuestion