Кто-то спросил , что-то компилируется с clang, но не с gcc. Я интуитивно понял, что происходит, и смог помочь человеку, но мне стало интересно - согласно стандарту, какой компилятор был прав? Вот своя версия кода:
#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;
}
Это компилируется с помощью clang++, но g++ дает следующую ошибку:
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";
Если я добавлю пару круглых скобок в строке 21, g++ счастлив:
(foo(x))("bar")("baz");
Другими словами, g++ интерпретирует эту строку как:
foo x ("bar")("baz");
Определяет свою ошибку в g++, но опять же, я хотел спросить стандартных экспертов, какой компилятор ошибся?
PS: gcc-4.8.3, clang-3.5.1