【发布时间】:2016-09-01 07:07:53
【问题描述】:
我有一个:
std::vector<std::shared_ptr<T>>
我想复制到一个
std::vector<std::shared_ptr<const T>>
现在我注意到,如果我这样做:
class A
{
public:
A(const std::vector<std::shared_ptr<int>>& list) : internalList(list.begin(), list.end()) {}
std::vector<std::shared_ptr<const int>> internalList;
};
它编译得很好(clang++ std==c++14),但如果我这样做:
class A
{
public:
A(const std::vector<std::shared_ptr<int>>& list) : internalList(list) {}
std::vector<std::shared_ptr<const int>> internalList;
};
我觉得奇怪的是,当我使用复制构造函数时它不起作用,因为它无法计算从非常量到常量的转换?
xxxx.cpp:672:56: error: no matching constructor for initialization of 'std::vector<std::shared_ptr<const int> >'
有人能解释一下为什么吗,如果我这样做的方式(在构造函数中使用迭代器)是最好的解决方案?
【问题讨论】:
-
如果它只是从非常量到常量的转换(即
int到const int)就好了。然而,这不是这里发生的事情,它是从一种类型的对象到完全不同类型的对象的转换。并且复制构造函数仅将其自己的类型作为参数,而不是不同的类型。 -
好吧,这是有道理的,但这样的事情不会起作用吗?
int a = 1; const int b = a?所以我的问题是为什么这个分配有效,为什么不能使用复制构造函数来完成?我真的很好奇是什么阻止了它这样做?我认为这不是出于优化原因... -
@user18490
const std::vector<T>与std::vector<const T>不同。因此与int和const int的类比不成立。