?
:
template <typename O>
A(O& o);
:
A{3};
O int, :
A(int& o);
, rvalue ( 3, ,) const const, .
?
O , forward x ( , int ):
template <typename O>
A(O&& o) : x{std::forward<O>(o)} {}
const lvalue ( rvalues ):
template <typename O>
A(const O& o) : x{o} {}
, const ( ), . , ( rvalue) .
, , , , .
r int&& rvalues, const int&.
lvalue int& -const lvalues (, x), const int&.
, , , , :
template <typename... Args>
A(Args&&... params);
template <typename O, typename... Args>
A(const O& z, Args&&... params);
. :
double x = 3.0;
A a(x, "test");
:
A(double&, const char (&)[5]);
A(const double&, const char (&)[5]);
( const).
- , O ( , , const lvalue), , int ( ):
template <typename T>
struct A : T
{
template <typename Arg, typename... Args, typename = typename std::enable_if<!std::is_constructible<int, Arg>::value>::type>
A(Arg&& param, Args&&... params) : T(std::forward<Arg>(param), std::forward<Args>(params)...), x(0) {
std::cout << "Member 'x' was default constructed\n";
}
template <typename O, typename... Args, typename = typename std::enable_if<std::is_constructible<int, O>::value>::type>
A(const O& o, Args&&... params) : T(std::forward<Args>(params)...), x(o) {
std::cout << "Member 'x' was constructed from arguments\n";
}
int x;
};
DEMO