C++ 隐式构造函数与;“空的”;建造师

C++ 隐式构造函数与;“空的”;建造师,c++,constructor,C++,Constructor,在下面的代码中,模板结构BB和CC除了构造函数外几乎相同。模板BB使用的构造函数不执行任何操作,而模板CC使用的是默认构造函数。当我使用Visual Studio 2013 update 4编译它时,在声明constInst2的行中抛出了一个错误,但在声明constInst的行中没有抛出错误: 错误C4700:使用了未初始化的局部变量“instance2” 我在初始化“实例”时也会遇到同样的错误。我是否误解了 “如果隐式声明的默认构造函数未被删除或 琐碎的,它被定义(即,生成一个函数体并 编译)

在下面的代码中,模板结构BB和CC除了构造函数外几乎相同。模板BB使用的构造函数不执行任何操作,而模板CC使用的是默认构造函数。当我使用Visual Studio 2013 update 4编译它时,在声明
constInst2
的行中抛出了一个错误,但在声明
constInst
的行中没有抛出错误:

错误C4700:使用了未初始化的局部变量“instance2”

我在初始化“实例”时也会遇到同样的错误。我是否误解了

“如果隐式声明的默认构造函数未被删除或 琐碎的,它被定义(即,生成一个函数体并 编译),它的效果与 具有空正文和空初始值设定项列表的用户定义构造函数。“

struct AA
{
类型定义INTA;
类型定义常量int b;
};
模板
结构BB
{
typename A::A A_A;
typedef typename A::b A_b;
BB()
{};
};
模板
结构CC
{
typename A::A A_A;
typedef typename A::b A_b;
CC()=默认值;
};
int main()
{
BB例;
BB:a_B constInst(实例a_a);
CCinstance2;
CC:a_B consticst2(实例2.a_a);
返回0;
}

Visual Studio中有一个编译器标志,用于将警告视为错误(/WX)。您可以关闭该标志以不将警告视为错误。您还可以选择忽略特定警告(/wd4100以禁用警告C4100)

您看到的是一个编译器警告,它被视为一个错误

这与标准中引用的解释无关

万一

BB< AA > instance;
BB实例;
编译器不会发出警告消息,因为您可能正在构造函数中执行有副作用的操作。编译器选择不深入研究构造函数的实现细节,以推断调用构造函数是否有副作用

CC< AA > instance2;
CCinstance2;

它能够推断构造对象没有副作用。

当询问有关特定编译器错误的问题时,请在问题中包含完整的错误消息。这很有帮助。@MarkRansom:更新了问题。@Hector我逐字记录了您的代码,用Visual Studio 2013 Update 4编译,只收到了一封warning:
警告C4700:使用了未初始化的局部变量“instance2”
它也可以编译,没有问题:@PaulMcKenzie:I have“警告转到错误”“设置。无论如何,关键是警告也应该出现在“instance”的初始化中。@Hector-警告是编译器认为是警告的任何东西。关于什么是警告没有标准。错误应该是什么有一个标准,上面的代码没有错误。在VS2017中,它实际上是一个错误。不是警告。我肯定没有打开“将警告视为错误”。还是一个很好的答案。@TobiMcNamobi,我没有访问VS2017的权限。希望你能从其他渠道得到答案。
CC< AA > instance2;