gpt4 book ai didi

c++ - 构造函数和 initializer_list

转载 作者:太空狗 更新时间:2023-10-29 21:02:16 25 4
gpt4 key购买 nike

有人能告诉我这背后的理论吗?

为什么最后一个调用没有编译?

test.cc: In function ‘int main()’: test.cc:15:12: error: too many braces around initializer for ‘int’ [-fpermissive] test.cc:15:12:

error: invalid conversion from ‘’ to ‘int’ [-fpermissive] test.cc:9:6: error: initializing argument 1 of ‘void f(std::initializer_list)’ [-fpermissive] test.cc:15:12:

error: aggregate value used where an integer was expected

我认为 c++11 或 g++ 4.7 在这方面有问题。谢谢!

#include <initializer_list>

class A {
public:
A(const std::initializer_list<int>) {}
};

void f(const std::initializer_list<int>) {}

int main() {
A({1}); // Compile OK
f({1}); // Compile OK
A({{{1}}}); // Compile OK
//f({{{1}}}); // Compile Error.
}

最佳答案

这就是我认为 GCC 的想法。

这是您的程序,多了 1 行,有趣的行已编号。

int main() {
A({1}); // 1. Compile OK
f({1}); // 2. Compile OK
A{{1}}; // 3. Compile OK, equivalent to 1.
A({{{1}}}); // 4. Compile OK
//f({{{1}}}); // 5. Compile Error.
}

为什么 GCC 编译 4 而不是 5?

为了清楚起见,假设#4 的结构实际上声明了一些东西:

A a{{{1}}};   // 4a. Compile OK

GCC 询问构造函数的参数,即 {{1}} 是否是可隐式转换为 A。也是:

A{{1}}

{{1}}A 的有效转换?是的 - 根据 3。

当然,这个推理不适用于#5;因此错误。

如果你想阻止 GCC 接受#4,那么阻止通过使启用构造函数显式启用转换:

class A { 
public:
explicit A(const std::initializer_list<int> il) {}
};

然后#4 会报错:

error: converting to ‘A’ from initializer list would use explicit constructor ‘A::A(std::initializer_list<int>)’

关于c++ - 构造函数和 initializer_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15859409/

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