gpt4 book ai didi

c++ - 为什么编译器在分配时调用模板化的复制构造函数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:59 24 4
gpt4 key购买 nike

考虑下面的代码:

#include <iostream>

template<class T>
struct X
{
X() = default;

template<class U>
X(const X<U>&)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}

/*
template<class U>
X& operator=(const X<U>&)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
return *this;
}
*/

};

int main()
{
X<int> a;
X<double> b;

b = a;
}

Live on Coliru

如您所见,赋值运算符被注释掉了。然而,行

b = a;

编译正常。我认为它不应该编译,因为 ab有不同的类型,operator=(const X&)由编译器默认生成的将由底层类型实例化,因此它不会分配 X<int>。到X<double> .

令我惊讶的是,代码可以编译,而且似乎正在调用模板化的复制构造函数。为什么是这样?是因为编译器首先尝试转换 ab然后调用默认生成的 B::operator=

最佳答案

如果TU是不同的类型,template<class U> X(const X<U>&)不是复制构造函数,因为它的参数是不同的类型。换句话说,X<int>X<double>是不相关的类型,所以这个构造函数只是它们之间的用户定义转换。

请注意,此代码不会打印任何内容:

X<int> a;
X<int> b { a };

因为在这种情况下,形式为 X<int>::X(const X<int>&) 的隐式声明的复制构造函数将被调用。

关于c++ - 为什么编译器在分配时调用模板化的复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43128664/

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