【发布时间】:2021-06-26 07:05:42
【问题描述】:
在下面的代码中,尽管 Line2 的 Account(20, "Dave") 是右值,但为什么调用复制构造函数 (Line1),而不是编译器抛出错误?在普通函数接收右值的情况下,如果我们使用左值引用作为输入参数,编译器会抛出错误。
#include <iostream>
#include <string>
#include <vector>
class Account
{
private:
int num;
std::string name;
public:
Account(int lnum, std::string lname) : num {lnum}, name {lname}
{
std::cout << "\n3arg constr";
}
Account(const Account &a) : Account{a.num, a.name} //Line1
{
std::cout << "\nCopy Constr";
}
};
int main()
{
std::vector<Account> myVec {};
myVec.push_back(Account(20, "Dave")); //Line2
std::cout << std::endl;
}
【问题讨论】:
-
由于
Account没有定义移动ctor (?)。 -
一个 lvalue-reference-to-const 可以绑定到 rvalues。
-
"在普通函数接收右值的情况下,如果我们使用左值引用作为输入参数,编译器会抛出错误。" -- 你能举个例子吗?据我所知,右值可以绑定到普通函数和构造函数中的
const左值引用。 (没有const,在普通函数和构造函数中都会出现错误。) -
您对下面提供的答案有任何疑问或问题吗?
标签: c++ copy-constructor move-constructor