C++ 初始化客户机类型对象的向量时出现复制构造函数错误
类C++ 初始化客户机类型对象的向量时出现复制构造函数错误,c++,vector,constructor,copy-constructor,C++,Vector,Constructor,Copy Constructor,类Foo只有一个默认构造函数和一个副本构造函数。由Foo类型的对象初始化的大小为10的向量在某种程度上是不正确的 #include <iostream> #include <vector> class Foo { public: Foo() = default; // Error1 Foo(Foo& foo) { // Error2 std::cout << "copied" <
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;
}
#包括
#包括
福班
{
公众:
Foo()=默认值;//错误1
Foo(Foo&Foo){//Error2
std::cout查看调用的std::vector的构造函数的签名:
vector(size_type n, const T& value, const Allocator& = Allocator());
参数f
通过常量引用(参数value
)传递。因此,该参数不能绑定到foo
复制构造函数的foo&
类型的非常量参数foo
相同(更简单)的情况:
您使用的构造函数是
将在构造函数内复制的参数值
为const,由于复制构造函数无法从const复制,因此构造函数的实现无法创建用于填充向量的副本。的构造函数文档显示以下签名:
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
这表明它需要val
作为const
引用。因为它很可能不会在其内部处理中剪切此const
,所以它似乎会像这样将val
传递给复制构造函数。因为Foo的复制构造函数希望传递一个非const
引用val
would丢失它的const
限定符。因为这是不允许的,编译器会引发错误
错误:候选构造函数不可行:第一个参数('const Foo')将丢失const限定符
修改复制对象的复制构造函数看起来很奇怪。请仔细阅读第二个错误。尝试使复制构造函数Foo(constfoo&Foo)
@SLN我猜std::vector
在复制之前添加了const
,以确保初始对象不会在一些奇怪的复制构造函数中发生更改,就像juanchopanza在发表评论时想到的那样。@SLN-这样想吧。如果我在你错过一节课后给你讲稿,让你复制,那就太糟糕了o在我的笔记本上乱涂乱画,不是吗?@bolov-抱歉什么?你不能将非常量引用绑定到常量对象或常量引用所引用的对象。这个答案完全正确。
vector( size_type count,
const T& value,
const Allocator& alloc = Allocator());
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());