【发布时间】:2012-04-02 14:16:18
【问题描述】:
这个问题来自this answer提出的问题。
通常,我们将T 类型的复制赋值运算符定义为T& operator=(const T&),并将T 类型的赋值运算符移动为T& operator=(T&&)。
但是,当我们使用值参数而不是引用时会发生什么?
class T
{
public:
T& operator=(T t);
};
这应该使 T 既可复制又可移动。但是,我想知道T 的语言分支是什么?
具体来说:
- 根据规范,这算作
T的复制赋值运算符吗? - 根据规范,这算作
T的移动赋值运算符吗? -
T会有编译器生成的复制赋值运算符吗? -
T会有编译器生成的移动赋值运算符吗? - 这对
std::is_move_assignable等特征类有何影响?
【问题讨论】:
-
如果我同时有 T& operator = (T t) 和 T& operator = (T && t) 的东西,我会在 Visual Studio 和 g++ 上遇到编译器错误,因为它不明确
-
@user929404:你应该这样做。关键是你用值赋值替换both复制和移动赋值。
标签: c++ c++11 language-lawyer move-semantics