【发布时间】:2019-09-14 08:13:21
【问题描述】:
从右值引用和 const 引用编写重载函数时,您可能会出现代码重复,因此我有时会使用相同的代码来执行这两个操作。如图所示:
#include <iostream>
#include <type_traits>
struct A {
template <typename T>
A& operator=(T&&) {
if constexpr (::std::is_rvalue_reference_v<T&&>) {
::std::cerr << "operator= move\n";
} else {
::std::cerr << "operator= copy\n";
}
return *this;
};
};
现在我的理解是这应该同时实现A& operator=(T const&) 和A& operator=(T&&)。所以给定这段代码,理论上我会期望这个调用:
int main() {
A a,b;
a = b;
a = ::std::move(b);
}
产生以下输出:
operator= copy
operator= move
但是,令我惊讶的是,第二行 (!) 不见了。如何同时覆盖两者?
我正在使用 g++ 8.3.0 和 -std=c++17 进行编译。
【问题讨论】:
-
看到这个similar question。
-
@1201ProgramAlarm 哦,这简直是邪恶的!他们到底为什么要这样做?!无论如何,谢谢。
-
@bitmask 我怀疑是因为复制/移动构造函数和赋值运算符具有特定属性,并且使某些模板实例化“特殊”是一堆没人愿意打开的蠕虫。
标签: c++ templates rvalue-reference const-reference