Der folgende Codetemporäre Objekte mit variablen Vorlagenargumenten; andere g ++/Klirren ++ Unterschied
struct foo
{
foo()
{ }
template <typename T0, typename ... Ts>
foo (const T0 & t0, const Ts & ... ts)
{ foo(ts...); }
};
int main()
{
foo f(1, 2);
return 0;
}
kompilieren, ohne Probleme mit g++
(4.9.2) und geben den folgenden Fehler
tmp_002-11,14,gcc,clang.cpp:9:16: error: expected ')'
{ foo(ts...); }
^
tmp_002-11,14,gcc,clang.cpp:9:13: note: to match this '('
{ foo(ts...); }
^
tmp_002-11,14,gcc,clang.cpp:9:14: error: redefinition of 'ts'
{ foo(ts...); }
^
tmp_002-11,14,gcc,clang.cpp:8:42: note: previous definition is here
foo (const T0 & t0, const Ts & ... ts)
^
2 errors generated.
mit clang++
(3.5).
Wie immer meine Frage ist: Wer hat Recht?
--- EDIT ---
Klarstellung: Ich weiß, dass foo(ts...)
kein Anruf an einen Delegierten Konstruktor sein kann, aber (ich glaube, das sein kann), um den Aufbau eines temporären foo
Objekt (ein anderes foo
Objekt).
Aber, wie von vssoftco, was passiert, wenn sizeof...(ts) == 1U
?
In diesem Fall foo(ts...);
ist eine (Wieder-) Erklärung eine einzelne Variable ts
(so, nehme ich an, sollte clang++
richtig sein) oder die variadische Syntax Vermeidung dieses Problems (so, nehme ich an, sollte richtig sein g++
)?
Es gibt C++ 11 Standard-Experten, die das klären können?
ps.entschuldigung für mein schlechtes Englisch.
Ich glaube nicht, dass Sie einen Konstruktor aufrufen dürfen, also sollte gcc das auch ablehnen. – vsoftco
@vsoftco - die Idee ist ein temporäres Objekt zu erstellen, aber ... Ich denke, das Problem ist, wenn diese nur ein Argument – max66
Ohh ich sehe, aber ich denke, der Compiler glaubt, Sie haben einen Anruf dort. Ich bin mir allerdings nicht 100% sicher. In jedem Fall sollte die Delegierung des Konstruktors funktionieren: 'foo (const T0 & t0, const T & ... ts): foo (ts ...) {}' – vsoftco