C++ 多重继承中的派生类的行为类似于聚合

C++ 多重继承中的派生类的行为类似于聚合,c++,templates,multiple-inheritance,c++17,C++,Templates,Multiple Inheritance,C++17,我可以在cppreference中找到以下代码进行编译 上面的代码是如何在C++17中编译的?它不在C++14中编译。幕后发生了什么?还有,为什么变量使用声明在C++14中不起作用?这是哪项新功能?如您在中所读 在C++17中引入 以下是所有允许的上下文的列表:[……] 使用声明 在使用声明时,省略号可能出现在声明器列表中,这在从参数包派生时非常有用: 有趣的我认为这在C++14中也适用,不知何故,C++17中的扩展规则发生了变化?您可以简化您的示例:在C++17中,您的示例也可以编译,而不使用

我可以在cppreference中找到以下代码进行编译

上面的代码是如何在C++17中编译的?它不在C++14中编译。幕后发生了什么?还有,为什么变量使用声明在C++14中不起作用?这是哪项新功能?

如您在中所读

在C++17中引入

以下是所有允许的上下文的列表:[……]

使用声明 在使用声明时,省略号可能出现在声明器列表中,这在从参数包派生时非常有用:


有趣的我认为这在C++14中也适用,不知何故,C++17中的扩展规则发生了变化?您可以简化您的示例:在C++17中,您的示例也可以编译,而不使用std::decation_t和std::forward。这表示自C++17以来,公共基不再阻止类被聚合。这说明在C++17中添加了变量用法。
#include <type_traits>
#include <utility>

template <typename... Types>
struct Overload : public Types... {
    using Types::operator()...;
};
template <typename... Types>
auto make_overload(Types&&... instances) {
    return Overload<std::decay_t<Types>...>{std::forward<Types>(instances)...};
}

int main() {
    auto overloaded = make_overload([](int) {}, [](double) {});
    static_cast<void>(overloaded);
}
template <typename... bases>
struct X : bases... {
    using bases::g...;
};
X<B, D> x; // OK: B::g and D::g introduced