Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化客户机类型对象的向量时出现复制构造函数错误_C++_Vector_Constructor_Copy Constructor - Fatal编程技术网

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());