Если вы определяете конструктор принимающий один и только один аргумент, такой конструктор будет использоваться для неявного приведения из типа аргумента в тип вашего класса. Используйте
explicit
, если хотите изменить это поведение.
class Foo
{
public:
Foo(int v) : _v(v) {}
private:
int _v;
};
class Bar
{
public:
explicit Bar(int v) : _v(v) {}
private:
int _v;
};
void baz(Foo foo) {/* some code */}
void qux(Bar bar) {/* some code */}
int main()
{
Foo foo = Foo(4);
Bar bar = Bar(4);
baz(foo); // Ok.
baz(4); // Ok.
qux(bar); // Ok.
qux(4); // Fail.
}