#include<tuple>
#include<iostream>
using namespace std;
class A
{
public:
int v;
A(int a) : v(a){}
operator int(){return v;}
};
class B
{
public:
int v;
B(int a) : v(a + 1) {}
operator int(){return v;}
};
class C
{
public:
int v;
C(int a) : v(a + 2){}
operator int(){return v;}
};
template <typename... Args >
int f(int a, Args... args)
{
tuple<Args...> argstuple1(std::forward<Args>(a)...);
tuple<Args...> argstuple2(Args{a}...);
//The following initialization won't compile
tuple<Args...> argstuple2(Args(a)...);
cout << (int)std::get<2>(argstuple2) << endl;
return 1;
}
int main()
{
f< A, B, C>(5,0,0,0);
}
私がここでやろうとしているのは、3つの異なる方法でこの同じ値を扱う3つの異なるクラスがあるということです。ここで得られる問題は、パラメータパックを拡張し、与えられた単一の値を持つ各クラスを初期化する方法です。なぜvariadicテンプレートのパラメータパックが展開されていないのですか?
tuple<Args...> argstuple2(Args(a)...);
私は、コンパイラはこれを好きではないように上記のコードは
tuple<A, B, C> argstuple2(A(a), B(a), C(a));
ルックスに展開されるだろうと思うだろう。 ただし、以下のすべてのコードがちょうど
tuple<Args...> argstuple2(Args(1)...);
tuple<Args...> argstuple2(Args{a}...);
tuple<Args...> argstuple2(std::forward<Args>(a)...);
罰金をコンパイルするだろう、私はArgsの(A)...を展開して失敗した理由を知りたいですか? Args(a)...とArgs {a} ...の違いは何ですか?どのようにstd :: forward(a)...)?
私はGNU 4.7.1
曖昧さを? 'tuple argstuple3((Args(a))...);)を試しましたか? (注:名前も変更されていますが、それは以前のdeclと競合します)。 –
WhozCraig
@WhozCraigあなたは絶対に正しいです、(Args(a))...それを修正します。あなたは少し精巧にできますか?ここではあいまいさは何ですか?どうもありがとう。 – codeinc
ほとんどのVexing解析: – Quentin