带有成员参数列表的 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,其中有一个成员 FooFoo 应该用向量初始化,而 BarFoo 作为构造函数参数。这里没什么异常。

令人惊讶的是,我注意到我可以这样做 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) 也是一个转换构造函数。