c ++为什么这个例子中的构造函数被调用了两次?

gen*_*sys 5 c++ templates constructor

我只是试着了解以下情况的行为:

template <typename T1>
struct A{
    template <typename T2>
    A(T2 val){
        cout<<"sizeof(T1): "<<sizeof(T1)<<" sizeof(T2): "<<sizeof(T2)<<endl;
    }
    T1 dummyField;
};
Run Code Online (Sandbox Code Playgroud)

所以 - 该类用T1模板化,构造函数用T2模板化

现在 - 如果我写:

A<bool> a = A<bool>(true);
Run Code Online (Sandbox Code Playgroud)

输出符合预期:

sizeof(T1): 1 sizeof(T2): 1
Run Code Online (Sandbox Code Playgroud)

但是 - 如果我写:

A<bool> a = A<float>(3.5f);
Run Code Online (Sandbox Code Playgroud)

输出是:

sizeof(T1): 4 sizeof(T2): 4
sizeof(T1): 1 sizeof(T2): 4
Run Code Online (Sandbox Code Playgroud)

为什么构造函数使用模板参数float调用两次?

谢谢你满足我的好奇心

Sum*_*uma 7

如何避免复制?

在这两种情况下,都会调用两个构造函数,但是在第一种情况下您没有看到它,因为其中一个是编译器生成的构造函数.如果要避免复制,则需要使用不同的语法,如下所示:

A<bool> a(true);

A<bool> a(3.5f);
Run Code Online (Sandbox Code Playgroud)

为什么(和什么)复制构造函数被调用?

A<bool> a = A<bool>(true);
Run Code Online (Sandbox Code Playgroud)

这里A(bool val)构造函数用于构造临时值,而默认编译器生成的复制构造函数用于执行A到A的复制.您正在复制相同的类型,并且对于相同类型的复制构造函数.这里有趣且不明显的事实是:模板构造函数永远不会用作复制构造函数,即使它看起来像一个.

A<bool> a = A<float>(3.5f);
Run Code Online (Sandbox Code Playgroud)

这里A<float>(float val)首先使用构造函数构造临时值,然后使用A<bool>( A<float> val)模板化构造函数来执行复制.


jos*_*efx 6

在第一个示例中,您对复制构造函数进行了隐式调用

A<bool>(A<bool> const&)
Run Code Online (Sandbox Code Playgroud)

在你的第二个例子中,这不会工作,因为你有两种不同的类型,所以编译器必须使用你的模板化构造函数来创建一个新的对象声明

 template <typename T2>
A(A<T2>const& val){
    cout<<sizeof(val.dummmyField)<<endl;
}
Run Code Online (Sandbox Code Playgroud)

应该说清楚