带有右值引用参数的模板赋值运算符与 vs2013 和 gcc 的行为不同
Template assignment operator with rvalue reference argument behaves differently with vs2013 and gcc
为什么下面的代码
#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;
}
使用 Visual Studio Express 2013 打印A::operator= called
,但在使用 gcc-4.9.1 编译时不打印任何内容。
正确的行为是什么?
编辑:模板赋值运算符重载之谜没有解决VS/gcc编译器的差异。
GCC 是正确的。您的类型具有隐式声明的移动分配运算符,该运算符比模板更匹配。
如果您导致隐式移动赋值被禁止,例如通过添加用户声明的析构函数,则将使用您的模板。
相关文章:
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- 普通环路未使用gcc 4.8.5自动矢量化
- 有了gcc,是否可以链接库,但前提是它存在
- 在clang++预处理器中确定gcc工具链版本
- 为什么Clang和VS2013接受移动大括号初始化的默认参数,而不接受GCC 4.8或4.9
- 带有右值引用参数的模板赋值运算符与 vs2013 和 gcc 的行为不同
- std::与VS2013相比,GCC 4.7.2中的MAP实现效率非常低
- GCC与VS2013中std::setprecision(0)的正确行为
- 自分配中的后增量,VS2013和GCC之间的结果不同
- VS2013过载错误(GCC不会发生)