I have a class like this, except with multiple members:
struct S {
S( S&& s ) : member( std::move( s.member ) ) {}
std::vector< int > member;
};
I basically want aggregate initialization on it like so:
S s{ {} };
But that seems to be impossible due to the custom constructor, so I'd like to emulate it using constructor arguments:
struct S {
S( S&& s ) : member( std::move( s.member ) ) {}
S( std::vector< int >&& vec ) : member( std::move( vec ) ) {}
S( const std::vector< int >& vec ) : member( vec ) {}
std::vector< int > member;
};
That looks like a lot of redundancy just to move if possible and copy otherwise, especially with more members since the number of permutations explodes. I think I want perfect forwarding?
struct S {
template< typename V >
S( V&& vec ) : member( std::forward< V >( vec ) ) {}
S( S&& s ) : member( std::move( s.member ) ) {}
std::vector< int > member;
};
But now I can't call it with an empty initializer list like so:
S s( {} );
Because the initializer list argument type can't be deduced. Is there any solution that doesn't require me to write
S s( std::vector<int>{} );
?
S s{ {} };
andS s;
? I.e. between your wanted constructor and the default constructor? – Some programmer dude