关于 Copy 构造函数和向量推回方法的错误

Error regarding Copy constructor and pushback method of vector

提问人:gabbar 提问时间:3/19/2021 最后编辑:Some programmer dudegabbar 更新时间:3/19/2021 访问量:165

问:

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)

我不清楚的是 生成错误的描述 .

  1. 在 error1 中,它说的是右值。在我的回推调用中,t2 是 l-val 而不是 r-val。正确?那么,错误说的是哪个r-val呢?

  2. 我还读到push_back call.it的语法是:void push_back(const value_type& val); 这需要一个 const 类型值,并且我正在传递一个非常量,这是可以的。但是我假设,push_back图片后面调用复制构造函数,然后将常量值传递给复制构造函数中的非常量参数,因此会出现错误?

你能帮我在这里澄清一下我的理解吗?

谢谢。

C++ C++11 向量 复制构造函数 推回

评论

2赞 Some programmer dude 3/19/2021
编辑您的问题,以包含以文本形式复制粘贴的代码,而不是图像。例如,在提出问题时为什么不上传代码/错误的图像? 以及 idownvotedbecau.se/imageofcode
0赞 gabbar 3/19/2021
Done.sorry for my ignorance

答:

1赞 mnikolic 3/19/2021 #1

使用 const 参数声明复制构造函数是您应该做的事情,预计这种构造函数将仅使用给定值进行初始化,因此得名。

  1. 错误是关于输出中给出的行,而不是push_back本身。所以,在实现的竞赛中,它可能是L值或R值。

  2. 是的,你的假设是正确的。