提问人:gabbar 提问时间:3/19/2021 最后编辑:Some programmer dudegabbar 更新时间:3/19/2021 访问量:165
关于 Copy 构造函数和向量推回方法的错误
Error regarding Copy constructor and pushback method of vector
问:
using namespace std;
class test {
public:
int p;
test() {
cout << "base" << endl;
}
test(int x) {
p = new int;* p = x;
cout<<"args" << endl;
}
test(test & args) {
p = new int;
*p = *(args.p);
cout<<“acopy”<< endl;
}
};
void print(test arg){
cout <<"funval"<< *(arg.p);
}
void printref(test & arg) {
cout <<“funref”<< *(arg.p);
}
int main()
{
test tl;
test t2 {10};
test t3 = t2;
print(t3);
printref(t2);
vector < test > myvec;
myvec.push_back(t2);
return 0;
}
你好
这里是 c++ 的新手。我正在尝试使用下面的代码来理解复制构造函数的调用。
我的理解似乎是正确的,直到我创建了我的类测试的向量。
当我运行下面的代码时,我遇到了行 - myvec.push_back(t2) 的错误
错误 1:
/usr/include/c++/6/bits/stl_construct.h:75:7:错误:来自类型为“test”的右值的 non—const 引用 test&' 的初始化无效
错误2:
/usr/include/c++/6/ext/new_allocator.h:120:4:错误:b 将“const test”输入到类型“test&”的引用 disca rds qualifiers { ::new((void *) p) _Up(std::forward<_Args>( args)。
我在这里读了几篇文章,我似乎也找到了解决方案,如下所示: 复制构造函数的更改 测试(const test&args)
我不清楚的是 生成错误的描述 .
在 error1 中,它说的是右值。在我的回推调用中,t2 是 l-val 而不是 r-val。正确?那么,错误说的是哪个r-val呢?
我还读到push_back call.it的语法是:void push_back(const value_type& val); 这需要一个 const 类型值,并且我正在传递一个非常量,这是可以的。但是我假设,push_back图片后面调用复制构造函数,然后将常量值传递给复制构造函数中的非常量参数,因此会出现错误?
你能帮我在这里澄清一下我的理解吗?
谢谢。
答:
使用 const 参数声明复制构造函数是您应该做的事情,预计这种构造函数将仅使用给定值进行初始化,因此得名。
错误是关于输出中给出的行,而不是push_back本身。所以,在实现的竞赛中,它可能是L值或R值。
是的,你的假设是正确的。
下一个:使用链表的类队列的三分法则
评论