与所有其他编译器一起使用的MSVC错误C2280(试图引用已删除的功能)

蒂姆·克鲁斯

以下代码无法使用所有最新版本的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>>构造,其中内部容器是基于节点的容器(如listmap)。他提出了一个不愉快的解决方法:

但是,您的代码可能有解决方法。如果将您的内部文件包装container<unique_ptr<whatever>>在一个类中,该类将手动删除其副本并默认其移动(基本上告诉编译器标准应该做什么,但不这样做),那么vector<YourWrapper<container<unique_ptr<whatever>>>>它将正常运行(并且在重新分配期间会得到移动)。

就我自己而言,我很不情愿地替换unique_ptrshared_ptr它不是关键性能代码,因此我愿意接受技术上不必要的性能冲击。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Visual Studio 2013和2015中的C ++编译器错误C2280“试图引用已删除的函数”

编译器错误C2280,尝试引用已删除的函数运算符=

使用Future时获取C2280(试图引用已删除的功能)

多级继承错误 C2280:“试图引用已删除的函数”

错误 C2280:Class::Class(void):试图引用已删除的函数

C++ 为什么在不使用被删除的函数时编译器失败,错误代码为 C2280

为什么此C ++代码可以与某些编译器一起编译,而不与其他编译器一起编译?

是否可以将 Clang libtooling 与其他编译器一起使用?

错误C2280:'QQmlPrivate :: QQmlElement <T> :: QQmlElement(void)':尝试引用已删除的函数

错误C2280:尝试引用已删除的函数(atomic <int>)

错误C2280:尝试引用已删除的函数(unique_ptr)

将QT Creator 5.8与MSVC 2015编译器一起使用

我真的需要Babel或其他编译器才能将ES6与React一起使用吗?

C++ msvc 编译器没有类型检查函数参数是一个引用

C++ 错误 (C2280) 尝试访问已删除的函数

与命名空间System.Collections一起使用时,IEnumerable报告编译器错误

将CRTP与static_assert一起使用时的编译器错误

为什么传递带有const引用成员的结构会导致C2280错误?

使用MSVC ++ 2013进行编译时,“ CXX编译器没有已知功能”

编译器错误:“错误CS0307:变量'int'不能与类型参数一起使用”

如何将 FieldArray 与可以具有其他功能的组件一起使用

“ Const”在C ++中还有什么其他功能,然后告诉编译器特定内容是只读的

将gcc_shared与构造函数一起使用时,gcc 4.7.3内部编译器错误

C++ 编译器优化(与 VSCode 一起使用的 MSYS2 MinGW-64 位 GCC 编译器)

同一程序在一个编译器中而不是其他编译器中给出编译器错误

我如何将JDK编译器与Dr Java一起使用,而不是Eclipse编译器?

C2280:复制构造函数的“尝试引用引用的已删除函数”,CC248“'operator ='无法访问在类中声明的私有成员”(Cocos2dx)

将数组用作映射键不能与C ++ 11编译器命令一起使用吗?

C++ MSVC/GCC/Clang 编译器错误