【发布时间】:2020-10-13 17:24:46
【问题描述】:
以下代码无法使用所有最新版本的 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));
【问题讨论】:
-
编译成什么标准?
-
c++17,例如gcc.godbolt.org/z/5E6qzc
-
错误似乎仍在制作副本。
emplace_back()不应该复制,但我不知道实际的标准措辞。
标签: c++ visual-c++