Welcher der Compiler ist richtig?Kann ein privates statisches Element als Standardargument für eine Elementfunktion seiner Klasse verwendet werden?
class A
{
public:
template <typename T>
void fun(void (*f)() = funPrivate<T>) {}
private:
template <typename T>
static void funPrivate() {}
};
int main(int argc, char** argv)
{
A a;
a.fun<int>();
return 0;
}
Compiliert fein auf: gcc Version 4.8.5 (Ubuntu 4.8.5-2ubuntu1 ~ 14.04.1)
Ergebnisse in einem Fehler auf: Klirren Version 3.4-1ubuntu3 (Tags/RELEASE_34/final) (basierend auf LLVM 3,4)
a.cpp:5:27: error: 'funPrivate' is a private member of 'A'
void fun(void (*f)() = funPrivate<T>) {}
^~~~~~~~~~~~~
a.cpp:14:3: note: in instantiation of default function argument expression for 'fun<int>' required here
a.fun<int>();
^
a.cpp:8:16: note: declared private here
static void funPrivate() {}
^
1 error generated.
Dies könnte mit der Optimierung zusammenhängen. Die fragliche Zeile tut nichts, also könnte GCC es optimieren. GCC klage nicht immer über Fehler in Sachen, die es optimiert. Ich wäre gespannt, was passiert ist, wenn Sie tatsächlich versucht haben, diesen Funktionszeiger zu verwenden. –
@WilliamKappler [Nichts geändert.] (Http://coliru.stacked-crooked.com/a/96df544565dac680) – songyuanyao
Seltsamerweise scheint clang es zu akzeptieren, wenn Sie 'funPrivate' nicht eine Vorlage machen. –