我在这个 C++11 代码上遇到编译错误,但我不知道为什么。这是代码:
#include <condition_variable>
class NonCopiableClass
{
std::condition_variable condition_;
};
struct NonCopiableStruct
{
std::condition_variable condition_;
};
class Test
{
public:
Test() :
myClass{},
myStruct{}
{};
private:
NonCopiableClass myClass;
NonCopiableStruct myStruct;
};
Visual Studio 2015 失败并出现以下错误:
错误 C2280: 'std::condition_variable::condition_variable(const std::condition_variable &)': 试图引用已删除的函数 1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\mutex(550 ): 注意:见 'std::condition_variable::condition_variable' 的声明。
如果我将其更改Test constructor
为不使用 C++11 统一初始化,则Struct
它可以编译。
Test() :
myClass{},
myStruct() // <--- CHANGE
{};
我不明白为什么Struct
类型使用复制构造函数,但Class
似乎还可以。它只发生在Struct
具有不可复制的成员的情况下。
我还注意到,如果我在成员初始化器列表的Struct
外部初始化它可以工作:Test Class
int main()
{
NonCopiableStruct a{};
return 0;
}
知道为什么这段代码失败了?引擎盖下发生了什么?myClass
初始化和初始化有什么区别myStruct
?为什么如果在类成员上使用它不会编译initializer list
但我可以在外面使用它吗?我试过了GCC
,似乎没问题。