Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;为什么在这个例子中构造函数被调用了两次?_C++_Templates_Constructor - Fatal编程技术网

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

C++ c++;为什么在这个例子中构造函数被调用了两次?,c++,templates,constructor,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; }; 然而,如果我写: A&l

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

template <typename T1>
struct A{
    template <typename T2>
    A(T2 val){
        cout<<"sizeof(T1): "<<sizeof(T1)<<" sizeof(T2): "<<sizeof(T2)<<endl;
    }
    T1 dummyField;
};
然而,如果我写:

A<bool> a = A<bool>(true);
A<bool> a = A<float>(3.5f);
为什么使用模板参数float调用构造函数两次


感谢您满足了我的好奇心,因为您首先创建了模板类的float实例

这是
A(3.5f)
部分

然后通过将
A
转换为
A
来创建
A
。因此,首先为
A
-实例调用构造函数。调用
A
的复制构造函数。

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

A<bool> a(true);

A<bool> a(3.5f);
A(真);
A(3.5f);
为什么(以及什么)调用复制构造函数?
A=A(真);
此处,A(bool val)构造函数用于构造临时值,而默认编译器生成的复制构造函数用于将A复制到A。您正在复制相同的类型,并且对于相同的类型,将使用复制构造函数。这里有一个有趣且不明显的事实:模板构造函数从未用作副本构造函数,即使它看起来像副本构造函数。

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

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

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

A<bool>(A<bool> const&)
A(常数&)
在第二个示例中,这不起作用,因为您有两种不同的类型 因此,编译器必须使用模板构造函数来创建新对象 宣布

 template <typename T2>
A(A<T2>const& val){
    cout<<sizeof(val.dummmyField)<<endl;
}
模板
A(阿康斯特和瓦尔){

第二种情况下,正确的语法是什么?这避免了两次调用构造函数:创建一个BoL类型的对象,但是将一个类型浮点的参数传递给构造函数?自从我使用C++以来,已经有一段时间了。我想它会是。<代码> A(3.5F)。
;是否没有创建对象的bool版本的构造函数,但将float作为参数?有,但要使用它,您必须编写:a(3.5f);如果要避免被另一个构造函数调用复制,则需要使用直接初始化语法,而不是赋值语法。
A<bool> a = A<float>(3.5f);
A<bool>(A<bool> const&)
 template <typename T2>
A(A<T2>const& val){
    cout<<sizeof(val.dummmyField)<<endl;
}