次のスニペットがあるとします。
template <class T> void f(T arg) { arg(); }
void g()
{
struct { void operator()(void) { } } foo;
f(foo);
}
Visual C++ はこれを受け入れます。ただし、GCC を試すと、次のようになります。
$ g++ --version # just in case this matters
g++ (Debian 4.4.5-8) 4.4.5
...
$ g++ foo.cc
foo.cc: In function 'void g()':
foo.cc:7: error: no matching function for call to 'f(g()::<anonymous struct>&)'
foo
グローバルにスコープされ、そのタイプに名前がある場合、これは機能します。ただし、型が匿名であるか、内部で宣言されg()
ている場合はそうではありません。
GCC がこれを拒否するのはなぜですか? 有効な C++ ですか?