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调用两次?
谢谢你满足我的好奇心
在这两种情况下,都会调用两个构造函数,但是在第一种情况下您没有看到它,因为其中一个是编译器生成的构造函数.如果要避免复制,则需要使用不同的语法,如下所示:
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)模板化构造函数来执行复制.
在第一个示例中,您对复制构造函数进行了隐式调用
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)
应该说清楚
| 归档时间: |
|
| 查看次数: |
909 次 |
| 最近记录: |