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 这一步,
(比较菜,大佬们轻喷)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.