成员初始值设定项列表错误的统一初始化
Uniform initialization on member initializer list error
我在这个 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
拥有不可复制的成员时。
我还注意到,如果我在Test Class
成员初始值设定项列表之外初始化Struct
它有效:
int main()
{
NonCopiableStruct a{};
return 0;
}
知道为什么这段代码失败吗?引擎盖下发生了什么?myClass
初始化和myStruct
初始化有什么区别?为什么如果在类成员initializer list
上使用它不会编译,但我可以在外面使用它吗?我已经试过GCC
,似乎还可以。
这似乎是一个MSVC错误。不同之处在于,struct
版本是聚合版本,而class
版本不是(由于默认的专用访问说明符)。
类版本由{}
初始化的值。结构版本已聚合初始化。一个符合标准的编译器应该只列出初始化condition_
{}
,因为你没有为它提供初始值设定项。
但是 MSVC 似乎偶然发现了这样一个事实,即聚合的成员是从初始值设定项列表中的相应初始值设定项进行复制初始化的。它似乎检查了副本c'tor,即使它不应该实际使用它。
这进一步得到了以下事实的支持:它知道在成员初始值设定项列表之外初始化相同类型的对象时该怎么做。
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 如何使用C++初始化向量;脚本化值不是数组、指针或矢量错误
- 分段错误 - 读取初始化指针的数组
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 修复未初始化的局部变量错误
- 初始化迭代器错误 C++ 在 GCC 编译器中
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 类型为 "Bucket&"(未限定的 const 限定)的引用不能使用 "SortedList." 类型的值进行初始化 如何修复此错误?
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么我在向量初始化时收到此错误?
- C1001内部编译器错误是由于矢量初始化(如数组)引起的
- 初始化thread_local叮当中的错误
- Eclipse:错误:初始化模式失败(无法连接到目标)
- C 错误:初始化量太多
- Seg 错误初始化列表向量与控制台输入
- 通过传递的指针段错误初始化 char 数组
- c++错误:初始化器元素不是常量
- C++错误:初始化结构实例的向量数组成员
- Visual Studio C++11g编译错误-初始化程序过多
- OpenCV 错误:初始化 OpenCLDevices 中的 GPU API 调用 (-1001)