https://www.cnblogs.com/pointer-smq/p/5297682.html 这篇文章说 这条语句 label = 2 会让编译器隐式调用 Token 的构造函数用 2 构造一个 Token ,参数的_content 采用默认值“”,然后又调用隐式生成的移动赋值(move assignment)函数,进行赋值。
我就根据程序,再加一个移动构造函数,却发现报错了。
#include <iostream>
using namespace std;
struct Token
{
int label;
string content;
Token(int _label = -1, string _content = "")
: label(_label)
, content(_content)
{
cout << "defalut" << endl;
}
Token(Token&& d)
: label(d.label)
, content(d.content)
{
cout << "move" << endl;
}
};
int main()
{
Token label(1, "hello");
label = 2; //这 tm 是合法的!!!
return 0;
}
报错:无法引用 函数 "Token::operator=(const Token &)" (已隐式声明) -- 它是已删除的函数。这是为啥啊?
还有,文中说:当你写一个赋值语句的时候,编译器会首先检查两个类型又没有直接实现的赋值函数,然后检查赋值左右的类型是否能做隐式转换和构造,转换或者构造好之后,再尝试进行拷贝或移动赋值。这是顺序是对的吗?
比如 label = 2 这一步,
- 如果 operator=有定义,就直接执行 operator=这一步就行呗(即只有一个步骤)?
- 如果 operator=没有定义,那就得先执行 拷贝函数函数弄个临时变量,再调用移动构造函数(肯定有两个步骤)?
(比较菜,大佬们轻喷)