带有成员参数列表的 C++ 隐式构造函数?
C++ implicit constructor with member's argument list?
抱歉,我没有正确使用 C++ 命名法。我还尝试搜索 Whosebug 和 Cppreference,但找不到有关此案例的信息。
我们来看下面的一段代码。
struct Foo{
vector<int> vec;
Foo(vector<int> inp) : vec(inp){};
};
struct Bar {
Foo foo;
Bar(Foo inp) : foo(inp) {};
};
int main()
{
vector<int> vec = {1,2,3};
Foo foo(vec);
Bar bar1(foo);
Bar bar2(vec);
}
所以,我有 Bar
,其中有一个成员 Foo
。 Foo
应该用向量初始化,而 Bar
将 Foo
作为构造函数参数。这里没什么异常。
令人惊讶的是,我注意到我可以这样做 Bar bar2(vec)
。看起来存在一个隐式定义的构造函数,它看起来像 Bar(vector<int> vec) : foo(vec){}
.
这让我很惊讶。据我所知,c++ 仅隐式生成默认、移动和复制构造以及析构函数。在这种情况下,看起来它生成了一个构造函数,该构造函数反映了成员的参数列表并将其传递给成员的构造函数。这是现实中发生的事情吗?您能否提供有关此行为的更多信息?
Foo
有一个 converting constructor 拿了一个 vector
。在 Bar bar2(vec);
中,vec
通过转换构造函数隐式转换为临时 Foo
,然后临时 Foo
作为参数传递给 Bar
的构造函数.
可以将Foo
构造函数标记为explicit
来禁止隐式转换:
struct Foo{
vector<int> vec;
explicit Foo(vector<int> inp) : vec(inp){};
};
顺便说一句:Bar::Bar(Foo)
也是一个转换构造函数。
抱歉,我没有正确使用 C++ 命名法。我还尝试搜索 Whosebug 和 Cppreference,但找不到有关此案例的信息。
我们来看下面的一段代码。
struct Foo{
vector<int> vec;
Foo(vector<int> inp) : vec(inp){};
};
struct Bar {
Foo foo;
Bar(Foo inp) : foo(inp) {};
};
int main()
{
vector<int> vec = {1,2,3};
Foo foo(vec);
Bar bar1(foo);
Bar bar2(vec);
}
所以,我有 Bar
,其中有一个成员 Foo
。 Foo
应该用向量初始化,而 Bar
将 Foo
作为构造函数参数。这里没什么异常。
令人惊讶的是,我注意到我可以这样做 Bar bar2(vec)
。看起来存在一个隐式定义的构造函数,它看起来像 Bar(vector<int> vec) : foo(vec){}
.
这让我很惊讶。据我所知,c++ 仅隐式生成默认、移动和复制构造以及析构函数。在这种情况下,看起来它生成了一个构造函数,该构造函数反映了成员的参数列表并将其传递给成员的构造函数。这是现实中发生的事情吗?您能否提供有关此行为的更多信息?
Foo
有一个 converting constructor 拿了一个 vector
。在 Bar bar2(vec);
中,vec
通过转换构造函数隐式转换为临时 Foo
,然后临时 Foo
作为参数传递给 Bar
的构造函数.
可以将Foo
构造函数标记为explicit
来禁止隐式转换:
struct Foo{
vector<int> vec;
explicit Foo(vector<int> inp) : vec(inp){};
};
顺便说一句:Bar::Bar(Foo)
也是一个转换构造函数。