以下代码无法使用所有最新版本的MSVC进行编译,但是可以使用所有最新版本的GCC和Clang进行编译:
#include <vector>
#include <memory>
#include <list>
using namespace std;
struct A
{
int a;
};
int main (int argc, char **argv)
{
vector<list<unique_ptr<A>>> v;
v.emplace_back();
}
对于所有最新版本的MSVC,此emplace_back()
调用都会触发编译器错误C2280“试图引用已删除的函数”。
这段代码实际上是错误的吗?我知道它是在向量v的末尾就地构造一个空列表。
如果它是错误的,我应该如何构建这个列表,并将它放置在载体?我已经尝试过显式构造一个空列表并将其移动到向量中,并得到相同的C2280结果:
list<unique_ptr<A>> elem;
v.push_back(move(elem));
看起来这是一个更普遍的问题的示例,该r / cpp线程中的MSVC标准库的主要实现者已经确认了这一问题。该问题适用于所有container<container<unique_ptr>>
构造,其中内部容器是基于节点的容器(如list
或map
)。他提出了一个不愉快的解决方法:
但是,您的代码可能有解决方法。如果将您的内部文件包装
container<unique_ptr<whatever>>
在一个类中,该类将手动删除其副本并默认其移动(基本上告诉编译器标准应该做什么,但不这样做),那么vector<YourWrapper<container<unique_ptr<whatever>>>>
它将正常运行(并且在重新分配期间会得到移动)。
就我自己而言,我很不情愿地替换unique_ptr
为shared_ptr
。它不是关键性能代码,因此我愿意接受技术上不必要的性能冲击。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句