【发布时间】:2019-04-30 10:29:42
【问题描述】:
Foo 类只有一个默认构造函数和一个复制构造函数。由 Foo 类型的对象初始化的大小为 10 的向量在某种程度上是不正确的。
#include <iostream>
#include <vector>
class Foo
{
public:
Foo() = default; // Error1
Foo(Foo& foo) { // Error2
std::cout << "copied" << std::endl;
}
};
int main( void )
{
Foo f;
std::vector<Foo> vec(10, f); // Error3
return 0;
}
上面的示例代码有3个错误:
错误 1: 候选构造函数不可行:需要 0 个参数,但提供了 1 个
错误 2: 候选构造函数不可行:第一个参数 ('const Foo') 将丢失 const 限定符
Error3: 在此处请求的成员函数 'std::__1::vector >::vector' 的实例化中
当我在主函数中删除复制构造函数或向量时,没有错误。
问题:
代码的哪一部分错了,为什么?
附言
当向量定义被Foo ff(f) 替换时,错误也消失了。 const 限定符是向量请求的吗?
【问题讨论】:
-
一个修改它所复制的东西的复制构造函数看起来很奇怪。
-
仔细阅读第二个错误。
-
尝试制作复制构造函数
Foo(const Foo& foo) -
@SLN 我猜
std::vector在复制之前添加了const,以确保在一些奇怪的复制构造函数中初始对象不会被更改,比如 juanchopanza 在发表评论时想到的那些。 -
@SLN - 可以这样想。如果我在你缺课后给你讲课要抄笔记,在我的笔记本上乱涂乱画是很糟糕的形式,不是吗?
标签: c++ vector constructor copy-constructor