类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限定符
在此处请求成员函数'std :: __ 1 :: vector> :: vector'的错误3:
当我在主函数中删除复制构造函数或向量时,没有错误。
问题:
代码的哪一部分是错误的,为什么?
p.s。
将向量定义替换为Foo ff(f)
时,错误也消失了。向量是否要求const
限定词?
答案 0 :(得分:4)
查看def __repr__(self):
return f"Player has {'Soft' if self.soft > 0 else ''} {self.count}. Cards are {self.cards}."
的调用构造函数的签名:
std::vector
参数vector(size_type n, const T& value, const Allocator& = Allocator());
由const引用(参数f
)传递。因此,该参数不能绑定到value
的复制构造函数的类型foo
的非常量参数Foo&
。
相同(更简单)的情况:
Foo
答案 1 :(得分:1)
您使用的构造函数为std::vector::vector (2)
vector( size_type count, const T& value, const Allocator& alloc = Allocator());
将要在构造函数内部复制的参数value
是const,并且由于您的复制构造函数无法从const复制,因此构造函数的实现无法创建副本来填充矢量。
答案 2 :(得分:0)
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
限定符。因为不允许这样做,所以编译器会引发错误
错误:候选构造函数不可行:第一个参数('const Foo')将失去const限定符