gpt4 book ai didi

c++ - 统一与遗留初始化产生不同的编译结果

转载 作者:可可西里 更新时间:2023-11-01 18:27:01 26 4
gpt4 key购买 nike

我在排列一段微不足道的代码时发现了这一点:

struct Base0 {};
struct Base1 {};

template<typename... Ts>
struct Derived: Ts... {};

int main() {
Derived<Base0, Base1> d0 {Base0{}, Base1{}}; // OK
Derived<Base0, Base1> d1 (Base0{}, Base1{}); // ERROR
}

我认为 d0d1 都应该导致编译错误,因为我看不到 Derived 没有任何匹配的 ctor 需要ctor 参数已传递,并将 d0 的编译标记为正常。

我可能缺少一些明显的东西。使它通过的统一初始化是什么?是聚合初始化还是什么?传递给 ctor 的临时对象发生了什么?

Using C++17 online compiler here

编辑

根据要求,我提供了喷出的复制粘贴:

main.cpp: In function ‘int main()’:
main.cpp:9:47: error: no matching function for call to ‘Derived::Derived(Base0, Base1)’
Derived<Base0, Base1> d1 (Base0{}, Base1{}); // ERROR
^
main.cpp:5:8: note: candidate: constexpr Derived::Derived()
struct Derived: Ts... {};
^~~~~~~
main.cpp:5:8: note: candidate expects 0 arguments, 2 provided
main.cpp:5:8: note: candidate: constexpr Derived::Derived(const Derived&)
main.cpp:5:8: note: candidate expects 1 argument, 2 provided
main.cpp:5:8: note: candidate: constexpr Derived::Derived(Derived&&)
main.cpp:5:8: note: candidate expects 1 argument, 2 provided

最佳答案

看起来这是 aggregate initialisation 的新 C++17 特性:

Each direct public base, (since C++17) array element, or non-static class member, in order of array subscript/appearance in the class definition, is copy-initialized from the corresponding clause of the initializer list.

随之而来的变化是,具有基类的类现在可以是聚合(只要它们不是virtualprivateprotected…尽管它们甚至不需要是聚合!😲)。

你的失败案例没有使用聚合初始化,而是尝试了一个很好的老式构造函数调用。正如您所确定的,不存在这样的构造函数。

关于c++ - 统一与遗留初始化产生不同的编译结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57201838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com