= make_pair 是否调用复制构造函数?

Does = make_pair Invoke the Copy Constructor?

提问人:Jonathan Mee 提问时间:11/30/2015 最后编辑:Jonathan Mee 更新时间:4/15/2021 访问量:2477

问:

通常,编译器将变量声明中的 视为移动构造。例如:=

vector<int> foo = vector<int>(13, 0);

将调用构造函数。vector<int>::vector<int>(vector<int>&&)

这如何与?如果我这样做,我是否正在构建一个临时的并移动它:make_pair

pair<int, int> foo = make_pair(13, 0);

显然,后果变得更加重要,因为 中的类型比 s 重,但问题保持不变。这里是临时建造的吗?如果强制临时,我想我可以调用:pairintmake_pair

pair<int, int> foo = pair(13, 0);

无论哪种方式,当类型可以隐式转换但不完全相同时呢?例如:

pair<string, int> foo = make_pair<"Hello World!", 13>;

艺术

pair<string, int> foo = pair("Hello World!", 13);

在这种情况下是否创建了临时?pair<const char*, int>

C++ 复制构造函数 赋值运算符 临时 标准对

评论

0赞 juanchopanza 11/30/2015
不是赋值运算符的“普通赋值运算符”。
1赞 Ely 11/30/2015
我不会说它是重复的。问题在标题中,与引用的副本不同。
1赞 Ely 11/30/2015
我认为人们需要能够构建桥梁才能理解重复回答问题。不过你是对的。但是,我认为在这里,我们可能会从STL的一个例子(即make_pair)的具体答案中受益。
1赞 juanchopanza 11/30/2015
第一个误解在我的第一条评论中。其次,您说初始化表达式涉及对移动复制运算符的调用,但如果复制省略启动,则不会。您似乎将赋值与初始化混淆了,并且可能将语义与复制省略一起移动。
1赞 juanchopanza 11/30/2015
它不是赋值运算符与是否省略副本完全无关。我想你很困惑。赋值和初始化在 C++ 中是不同的东西。并且是初始化,而不是赋值。T t = whatever;

答:

0赞 Yong Yang 4/15/2021 #1

std::make_pair返回对对象的 rvalue,然后赋值运算符将右值移动到左值,因为 std::p air 定义了复制/移动赋值运算符=

“对类对象的赋值由复制/移动赋值运算符定义。”

参考:Cpp11 标准 5.17 赋值和复合赋值运算符。