3
更新:
ありがとう、ジャンボリー。
これは最終的にstruct A
です。C++ - enable_if_tでパラメータパック(可変テンプレート)コンストラクタとコピーコンストラクタを導出します。
struct A
{
template<class ... Args,class=std::enable_if_t<(sizeof...(Args)!=1)>>
A(Args &&...args)
{
cout<<'v';
}
template<class Arg,class=std::enable_if_t<!std::is_base_of<std::remove_reference_t<Arg>,A>::value>>
A(Arg &&arg)
{
cout<<'v';
}
A(const A &)
{
cout<<'c';
}
A(A &&)
{
cout<<'m';
}
};
起源:このコードについて
、
#include<iostream>
#include<type_traits>
#include<utility>
using namespace std;
struct A
{
template<class ... Args,class=std::enable_if_t<
sizeof...(Args)!=1
||!std::is_same<std::remove_cv_t<std::remove_reference_t<Args>>,A>::value>>
A(Args &&...args)
{
cout<<'v';
}
A(const A &)
{
cout<<'c';
}
A(A &&)
{
cout<<'m';
}
};
int main()
{
A a{10};
A b{10,20};
A c{b};
const A d{c};
A e{move(c)};
}
出力はVC++ 14.0でvvvvm
です。
なぜ出力がvvccm
ではないのですか?
(私はc and d
は、コピーコンストラクタを使用します。そして、私は一つだけ転送参照効果的な近代的なC++項目27の使用を知っている。)
これは 'Args'の未拡張を使用するための悪い形成されるべきです。 –
しかし、 'std :: remove_reference_t'を使用すると、コンパイルエラーが発生します。 –
Caesar