gpt4 book ai didi

c++ - 为什么不转换在模板类中调用的构造函数?

转载 作者:行者123 更新时间:2023-11-27 23:49:03 26 4
gpt4 key购买 nike

我写了一个简单的C++程序:

#include <stdint.h>
#include <iostream>
using namespace std;

class B {
public:
B(const bool& value = false) {cout << "B" << endl;}
};

template <typename t1, typename t2>
class A {
public:
A(const t1 &value) {cout << "A1" << endl;};
A(const t2 &value) {cout << "A2" << endl;};
};

int main() {
typedef A<B, int8_t> T;
T v(false);

return 0;
}

据我了解,在以下代码中:

T v(false);

false可以触发B的转换构造函数( B(const bool& value = false) {cout << "B" << endl;} )被调用,所以第一个 A的构造函数应该运行。但实际上,第二个A的构造函数被调用。

那么为什么不调用转换构造函数呢?

最佳答案

调用第一个构造函数需要用户定义boolB 的转换。调用第二个将需要从 boolint8_t标准转换。后者是更好的匹配,我认为这是很自然的。

13.3.3.2 Ranking implicit conversion sequences
2 When comparing the basic forms of implicit conversion sequences (as defined in 13.3.3.1)
— a standard conversion sequence (13.3.3.1.1) is a better conversion sequence than a user-defined conversion sequence or an ellipsis conversion sequence, and
— a user-defined conversion sequence (13.3.3.1.2) is a better conversion sequence than an ellipsis conversion sequence (13.3.3.1.3).

请记住,bool 在 C++ 中被认为是一个整数类型,因此到 int8_t 的转换确实是一个相当不起眼的转换整数类型到另一个。用户定义的到 的转换是一个涉及更多的过程。语言规则倾向于简单地转换为 int8_t 也就不足为奇了。

关于c++ - 为什么不转换在模板类中调用的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48162853/

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