我写了一个简单的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
的构造函数被调用。
那么为什么不转换构造函数?
答案 0 :(得分:3)
调用第一个构造函数需要从bool
到B
进行用户定义的转换。调用第二个将需要从bool
到int8_t
的标准转换。后者是一个更好的匹配,我认为这很自然。
13.3.3.2对隐式转换序列进行排名
2 比较隐式转换序列的基本形式(如13.3.3.1中所定义)
- 标准转换序列(13.3.3.1.1)是比用户定义的转换序列或省略号转换序列更好的转换序列,并且
- 用户定义的转换序列(13.3.3.1.2)是比省略号转换序列(13.3.3.1.3)更好的转换序列。
请注意,bool
在C ++中被视为整数类型,因此转换为int8_t
确实是从一个整数类型到另一个整数类型的非常不显着的转换。用户定义的转换为类是一个涉及更多的过程。语言规则支持简单转换为int8_t
。