// as if A is an primitive type, pass by value // copy ctor; the two ways are identical auto b = a; // auto b{a};
// call empty ctor A c; // assignment copy c = b;
// implicit conversion from int to A; explicit prevents such conversion // additionally, copy-constructor can be disabled via this specifier as well // A::f(3);
// copy elision; equivalent to direct initialization auto d = A::create(); // auto d = A(3);
// forcing to call move ctor; identical auto e = static_cast<A&&>(A::create()); // auto e = move(A::create());