C++ 为什么这个代码赢了';如果声明了析构函数,是否编译?

C++ 为什么这个代码赢了';如果声明了析构函数,是否编译?,c++,c++11,C++,C++11,考虑以下C++11代码: #include <thread> #include <vector> struct A { A() {} //virtual ~A() = default; //~A() = default; //~A() {}; std::thread t; }; int main() { std::vector<A> v; v.emplace_back(); } 叮当声输出(~A

考虑以下C++11代码:

#include <thread>
#include <vector>

struct A {
    A() {}

    //virtual ~A() = default;
    //~A() = default;
    //~A() {};

    std::thread t;
};

int main()
{
    std::vector<A> v;
    v.emplace_back();
}
叮当声输出(
~A(){};
未注释):

$clang++--std=c++11-o test.cpp
在test.cpp中包含的文件中:1:
在/usr/bin/./lib/gcc/x86_64-linux-gnu/4.8/../../../../../../../include/c++/4.8/thread:40中包含的文件中:
在/usr/bin/./lib/gcc/x86_64-linux-gnu/4.8/../../../../../../../include/c++/4.8/memory:64中包含的文件中:
/usr/bin/./lib/gcc/x86_64-linux-gnu/4.8/../../../../../../../../include/c++/4.8/bits/stl_construct.h:75:38:错误:
调用“A”的隐式删除副本构造函数
{::新建(静态_-cast(u-p))_-T1(标准::转发(u-args));}
^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/./lib/gcc/x86_64-linux-gnu/4.8/../../../../../../../../../include/c++/4.8/bits/stl_未初始化。h:75:8:注意:
在函数模板专门化的实例化中
此处请求了“std::u构造”
std::_构造(std:uuuu地址(*uuuu cur),*u优先);
^
/usr/bin/./lib/gcc/x86_64-linux-gnu/4.8/../../../../../../../../../include/c++/4.8/bits/stl_未初始化。h:117:2:注意:
在函数模板专门化的实例化中
“std::\u未初始化\u副本::\u未初始化\u副本”已在此处请求
__取消输入副本(第一个、最后一个、结果);
^
/usr/bin/./lib/gcc/x86_64-linux-gnu/4.8/../../../../../../../../../../include/c++/4.8/bits/stl_未初始化。h:258:19:注意:
在函数模板专门化的实例化中
此处请求“std::未初始化的\u副本”
{return std::未初始化的_拷贝(u first,u last,u result);}
^
/usr/bin/./lib/gcc/x86_64-linux-gnu/4.8/../../../../../../../../../../include/c++/4.8/bits/stl_未初始化。h:279:19:注意:
在函数模板专门化的实例化中
请求“std::\未初始化\复制\u a”
在这里
返回标准::\未初始化\u复制\u a
^
/usr/bin/./lib/gcc/x86_64-linux-gnu/4.8/../../../../../../../../../include/c++/4.8/bits/vector.tcc:413:15:注:
在函数模板专门化的实例化中
'std::uu未初始化u移动u如果没有例外u a'
在此请求
=std::uu未初始化\u移动\u如果没有例外\u a
^
/usr/bin/./lib/gcc/x86_64-linux-gnu/4.8/../../../../../../../../../include/c++/4.8/bits/vector.tcc:101:4:注:
在函数模板专门化的实例化中,此处请求“std::vector::_M_emplace_back_aux”
_M_位置_back_aux(标准:向前(_args)…);
^
test.cpp:17:4:注意:在函数模板专门化的实例化中
此处请求“std::vector::emplace_back”
v、 安置你回来();
^
test.cpp:11:14:注意:“A”的复制构造函数被隐式删除,因为
字段“t”具有已删除的副本构造函数
标准:螺纹t;
^
/usr/bin/./lib/gcc/x86_64-linux-gnu/4.8/../../../../../../../../include/c++/4.8/thread:126:5:注意:
“线程”已在此处明确标记为已删除
线程(const thread&)=删除;
^
生成1个错误。
(答案摘自评论,我不记学分)

如果析构函数是手动声明的,则编译时不会创建默认的移动构造函数。强制使用默认移动构造函数将修复此问题:

A(A&& o) = default;

析构函数的显式规范禁止编译器合成移动构造函数。您必须手动添加一个。谢谢。添加
A(A&&o)=默认值解决了我的问题。值得一提的是,如果A有一个可复制的成员而不是std::thread,那么代码就可以工作了,因为在这种情况下A的复制构造函数不会被隐式删除(我不想编辑手机上的答案)。