以下可以在c ++ 17下编译
template<class... Ts>
struct Test : Ts...
{
using Ts::operator()...;
};
template<class... Ts> Test(Ts...) -> Test<Ts...>;
int main() {
Test test
{
[](const int& i) { },
[](const float& f) { }
};
}
但是,如果我将其更改为:
Test test
( //{ is changed to (
[](const int& i) { },
[](const float& f) { }
);//} is changed to )
它不会编译,因为Test没有这样的构造函数,它接受2个参数。我想知道为什么原代码有效?
因为聚合初始化在C ++ 17中变得更奇怪。基本上,如果使用一个或多个公共基类聚合初始化类,则初始化列表的第一个元素用于初始化基类。在这种情况下,在模板参数推导之后,可以使用默认的复制构造函数从lambda参数中正确初始化基类。