我在这段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报错如下:error 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 uniform initialization
,则可以编译通过。Test() :
myClass{},
myStruct() // <--- CHANGE
{};
我不明白为什么Struct
类型使用复制构造函数,而Class
似乎没问题。这只发生在Struct
具有不可复制成员的情况下。
我还注意到,如果我在Test Class
成员初始化列表之外初始化Struct
,它就能工作:
int main()
{
NonCopiableStruct a{};
return 0;
}
有什么想法,为什么这段代码失败了?发生了什么?myClass
的初始化和 myStruct
的初始化有什么区别?如果在类成员的 initializer list
中使用它,为什么无法编译,但在外部使用是可以的?我已经在 GCC
上尝试过,似乎没问题。