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