C++ 带有右值引用参数的模板赋值运算符与vs2013和gcc的行为不同
为什么下面的代码C++ 带有右值引用参数的模板赋值运算符与vs2013和gcc的行为不同,c++,templates,visual-studio-2013,assignment-operator,rvalue-reference,C++,Templates,Visual Studio 2013,Assignment Operator,Rvalue Reference,为什么下面的代码 #include <iostream> struct A { template<typename T> A &operator=(T &&rhs) { std::cout << "A::operator= called" << std::endl; return *this; } }; int main() { A a1; a1 =
#include <iostream>
struct A {
template<typename T>
A &operator=(T &&rhs) {
std::cout << "A::operator= called" << std::endl;
return *this;
}
};
int main() {
A a1;
a1 = A();
return 0;
}
#包括
结构A{
模板
运算符=(T&&rhs){
std::coutGCC是正确的。您的类型有一个隐式声明的移动赋值运算符,它比模板更匹配
如果您导致隐式移动分配被抑制,例如通过添加用户声明的析构函数,则将使用您的模板。Visual Studio中可能存在此模板的副本。它不会隐式生成移动构造函数和移动分配运算符。