【发布时间】:2015-10-27 19:33:55
【问题描述】:
赋值运算符可以推导出为成员函数模板的特例吗?
例如,我有一个带有一个 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;
}
在上面的代码 sn-p 中,clang 和 gcc 编译的二进制文件没有打印出任何关于赋值的内容——据我所知,默认赋值是在这里生成的,尽管有可能从模板中推断出来。
【问题讨论】:
-
复制赋值运算符是一个非模板函数。在您的代码中仍然调用了一个隐式生成的复制赋值运算符。它有利于书面函数,因为非模板函数优于模板函数。