gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:51 26 4
gpt4 key购买 nike

我只是试图理解以下情况的行为:

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

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

现在 - 如果我写:

A<bool> a = A<bool>(true);

输出符合预期:

sizeof(T1): 1 sizeof(T2): 1

但是-如果我写:

A<bool> a = A<float>(3.5f);

输出是:

sizeof(T1): 4 sizeof(T2): 4
sizeof(T1): 1 sizeof(T2): 4

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

谢谢你满足了我的好奇心

最佳答案

如何避免抄袭?

在这两种情况下都调用了两个构造函数,但是在第一种情况下您看不到它,因为其中一个是编译器生成的。如果你想避免复制,你需要使用不同的语法,像这样:

A<bool> a(true);

A<bool> a(3.5f);

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

A<bool> a = A<bool>(true);

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

A<bool> a = A<float>(3.5f);

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

关于c++ 为什么这个例子中的构造函数被调用了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2027556/

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