構造体に転送引数でメンバーを初期化させたいと思います。これは、デストラクタを宣言するときと、関数から構造体を返そうとするとき (コピー コンストラクタが必要だと思います) を除いて、コンパイルして正常に動作します。
#include <utility>
struct Foo
{
int val;
Foo(int val) : val(val)
{
}
};
struct FooContainer
{
Foo member;
template<typename... Args>
FooContainer(Args&&... args) :
member(std::forward<Args>(args)...)
{}
~FooContainer() {}
};
FooContainer getFooContainer()
{
FooContainer retval(0);
return retval;
}
int main() {}
コンパイラ エラーは次のとおりです。
example.cc: In constructor ‘FooContainer::FooContainer(Args&& ...) [with Args = FooContainer&]’:
example.cc:27: instantiated from here
example.cc:18: error: no matching function for call to ‘Foo::Foo(FooContainer&)’
example.cc:7: note: candidates are: Foo::Foo(int)
example.cc:4: note: Foo::Foo(const Foo&)
のコピー コンストラクターを生成しようとしているように見えますFooContainer
が、Foo を初期化する方法がないため失敗します。それでも、コンストラクタまたはデストラクタを削除すると、FooContainer
正常にコンパイルされます.* なぜこれを行うのですか?
*とにかく GCC 4.9.2でhttp://cpp.sh/に。Ubuntu の g++ 4.4.3 では、デストラクタが宣言されていなくても同じエラーが発生します。