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

时间:2018-01-09 06:59:31

标签: c++

我写了一个简单的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的构造函数被调用。

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

1 个答案:

答案 0 :(得分:3)

调用第一个构造函数需要从boolB进行用户定义的转换。调用第二个将需要从boolint8_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

,这并不奇怪