2012-10-23 14 views
15

は、私が呼び出しf()のために何が起こるか疑問に思いました。 vexing parseはxを関数宣言にしますか?コンパイラはそれを変数にしているようです。誰かが私がそれについて確かめるのを助けることができますか?X X(t ...)は、vexing parseを使用して関数宣言を実行できますか?私はそれを見ていたとき、私は</p> <pre><code>template<typename ...T> void f(T ...t) { X x(t...); // ... } </code></pre> <p>として関数テンプレートを書いていた

答えて

13

空のかっこ(())は、ソースコードにそのように記述されている場合にのみ、関数宣言にします。

§14.5.3 [temp.variadic] p6も、この言及:

はsizeofないパックの拡張のインスタンス化を...式は、リストNは、要素の数であるE1、E2、...、ENを生成しますパックの拡張パラメータで。 [...] Nが0の場合、展開のインスタンス化によって空のリストが生成されます。 そのようなインスタンシエーションは、リストを完全に省略すると、文法があいまいになるか、文法にあいまいされてしまう場合でも、囲み構造の構文的解釈を変更しません。 [例:

template<class... T> struct X : T... { }; 
template<class... T> void f(T... values) { 
X<T...> x(values...); 
} 
template void f<>(); // OK: X<> has no base classes 
        // x is a variable of type X<> that is value-initialized 

末端例]

のコード例で具体的に第二のコメントを見ます。

+0

オハイオ州私はそれを逃した可能性があります!ありがとう:-) –

関連する問題

 関連する問題