初始化客户类型对象的向量时复制构造函数错误
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
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