gpt4 book ai didi

c++ - 作为模板化成员函数的复制构造函数被忽略

转载 作者:行者123 更新时间:2023-11-30 00:47:56 25 4
gpt4 key购买 nike

是否可以将赋值运算符推导为成员函数模板的特例?

例如,我有一个带有一个 bool 参数的类模板,我想实现赋值操作,而不管模板参数的任何特定值。

#include <iostream>

template<bool sw>
struct A {
A() {
std::cout << __PRETTY_FUNCTION__ << '\n';
}

template<bool input_sw>
A & operator = (const A<input_sw> &a) {
std::cout << __PRETTY_FUNCTION__ << '\n';
return *this;
}
};

int main()
{
A<true> a;
A<true> b;
a = b;
}

在上面的代码片段中,clang 和 gcc 编译的二进制文件没有打印出任何关于赋值的信息——据我所知,默认赋值是在这里生成的,尽管有可能从模板中推导出它。

最佳答案

他们不打印任何东西是正确的。发生的事情是为 A<true> 创建了一个隐式 复制赋值运算符。带有这个签名:

A<true>& operator=(const A<true>& );

因此,当我们进行重载决议时,有两个可行的候选者:

A<true>& operator=(const A<true>& );     // implicit copy assignment
A<true>& operator=(const A<input_sw>& ); // [ with input_sw = true ]

两个运算符都采用相同的参数 ( const A<true>& ),因此从这个角度来看,它们是同等好的候选者。但非模板函数优于函数模板特化,这使得隐式复制赋值运算符成为最佳可行候选者。


现在,考虑一个替代方案。如果您以这种方式声明运算符模板会怎样:

template<bool input_sw>
A & operator =(A<input_sw> &a) { ... }

也就是说,不是const .这不是好的做法,我只是为了说明目的而介绍它。在这种情况下,我们的两个候选人 a=b是:

A<true>& operator=(const A<true>& );   // implicit copy assignment
A<true>& operator=(A<input_sw>& ); // [ with input_sw = true ]

现在两位候选人采取相同的论点。我们的运算符模板引用了非 const .在两个引用的情况下,引用最后一个 cv 限定类型的是首选,在这种情况下将是运算符。放下那个 const , 现在你的函数是首选的,你会看到打印的东西。

C++ 是最好的。

关于c++ - 作为模板化成员函数的复制构造函数被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33376944/

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