初始化客户类型对象的向量时复制构造函数错误

Copy constructor error when initilizing a vector of custormer typed objects

Class 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 个

Error2: 候选构造函数不可行:第一个参数 ('const Foo') 将丢失 const 限定符

Error3:在此处请求的成员函数'std::__1::vector >::vector'实例化

当我在主函数中删除复制构造函数或向量时,没有错误。

问题:

代码的哪一部分是错误的,为什么?

p.s.

当矢量定义替换为 Foo ff(f) 时,错误也消失了。向量是否请求 const 限定符?

查看std::vector的调用构造函数的签名:

vector(size_type n, const T& value, const Allocator& = Allocator());

参数f 由const 引用(参数value)传递。因此,该参数不能绑定到 Foo 的复制构造函数的 Foo& 类型的非常量参数 foo


相同(更简单)的案例:

Foo f;
const Foo& value = f;
Foo& foo = value;  // error

您使用的构造函数是std::vector::vector (2)

vector( size_type count, 
                 const T& value,
                 const Allocator& alloc = Allocator());

将在构造函数中复制的参数 value 是 const,并且由于您的复制构造函数无法从 const 复制,因此构造函数的实现无法创建副本来填充向量。

std::vector 的构造函数文档显示以下签名:

explicit vector (size_type n, const value_type& val = value_type(),
             const allocator_type& alloc = allocator_type());

这表明它需要 val 才能成为 const 参考。因为它很可能不会在它的内部处理中削减这个 const 它似乎将 val 像这样传递给复制构造函数。因为 Foo 的复制构造函数期望传递一个非 const 引用 val 将失去它的 const 限定符。因为不允许编译器引发错误

Error: candidate constructor not viable: 1st argument ('const Foo') would lose const qualifier