gpt4 book ai didi

c++ - 奇怪的构造函数行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:15 25 4
gpt4 key购买 nike

我正在使用 Visual Studio 2013,这就是我想要弄清楚的:

#include <iostream>
#include <vector>
using namespace std;

class A
{
public:
int x = 1;
bool y = true;

A(int _x, bool _y) : x(_x), y(_y)
{
cout << "Constructor #1" << endl;
}

A(std::initializer_list<int> init_list)
{
cout << "Constructor #2" << endl;
}
};


int main(int argc, char** argv)
{
A Aobj1(10, false);
A Aobj2(20, "false");
A Aobj3{30, false};
A Aobj4{40, "false"};

return 0;
}

输出是:

Constructor #1
Constructor #1
Constructor #2
Constructor #1
  • 第一次调用构造函数 #1 没问题

  • 现在 Aobj2(int, string) 调用构造函数 #1 的第二个构造很奇怪。编译器如何使用字符串参数调用 (int, bool) 构造函数? “假”bool 甚至没有转换为 int。

  • Aobj3 也可以。虽然 initializer_list 是 int 类型,但编译器会调用它,因为大括号初始化并将 bool 转换为 int。

  • 这个又让我感到困惑。我原以为这是一个错误,因为字符串无法转换为 int(就像 bool 一样),并且还希望编译器调用 initializer_list 构造函数,因为它是一个大括号初始化。但是编译器选择了 (int, bool) 构造函数。

编译器逻辑的背景是什么?

最佳答案

Now the second construction of Aobj2(int, string) calling constructor #1 is strange. How is the compiler calling the (int, bool) constructor with a string argument?

更准确地说,"false"类型为 const char[6]并且可以decayconst char* ,即一个指针,然后可以 implicitly convertbool .

A prvalue of integral, floating-point, unscoped enumeration, pointer, and pointer-to-member types can be converted to a prvalue of type bool.

The value zero (for integral, floating-point, and unscoped enumeration) and the null pointer and the null pointer-to-member values become false. All other values become true.

对于第4种情况,参数std::initializer_list<int>无法匹配参数 40, "false" ,因为没有隐式转换将指针转换为 int .然后构造函数取 int, bool被选中,因为 "false"可以转换为 bool隐含地如上所述。

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

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