2014-12-01 116 views
5

在以下代码中,除构造函数外,模板结构BB和CC几乎相同。模板BB使用一个不做任何事的构造函数,而模板CC使用默认的构造函数。当我使用Visual Studio 2013更新4编译它,抛出一个错误在声明constInst2但不能在声明constInst行线:隐式构造函数与“空”构造函数

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

初始化“实例”,以及当我希望同样的错误。我是不是误解this sentence

“如果隐式声明的默认构造函数没有被删除或 琐碎,它被定义(即,产生一个函数体和 编译)由编译器,它具有恰好与空体和空初始化列表一个 用户定义的构造相同的效果。”

struct AA 
{ 
    typedef int a; 
    typedef const int b; 
}; 

template< typename A > 
struct BB 
{ 
    typename A::a a_A; 
    typedef typename A::b a_B; 

    BB() 
    {}; 
}; 

template< typename A > 
struct CC 
{ 
    typename A::a a_A; 
    typedef typename A::b a_B; 

    CC() = default; 
}; 

int main() 
{ 
    BB<AA> instance; 
    BB<AA>::a_B constInst(instance.a_A); 

    CC<AA> instance2; 
    CC<AA>::a_B constInst2(instance2.a_A); 

    return 0; 
} 
+1

当询问有关特定编译器错误的问题时,请在问题中包含完整的错误消息。它有很多帮助。 – 2014-12-01 20:55:10

+0

@MarkRansom:更新了问题。 – Hector 2014-12-01 20:57:56

+0

@Hector我把你的代码逐字记录下来,用Visual Studio 2013 Update 4进行编译,并且只收到警告:'警告C4700:未初始化的局部变量'instance2'used'它也编译时没有问题:http:// ideone。 com/Hc1jB4 – PaulMcKenzie 2014-12-01 21:01:16

回答

1

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

你所看到的是一个正在被视为错误的编译器警告。

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

BB<AA> instance; 

的情况下,因为你可以做在具有副作用的构造函数的东西,编译器不会发出警告消息。编译器选择不研究如何实现构造函数的细节来推断调用构造函数是否有副作用。

CC<AA> instance2; 

则能够推断出有构造对象的无副作用的情况。

+0

在VS 2017中它实际上是一个错误。不是一个警告。而且我绝对没有打开“将警告视为错误”。还是一个很好的答案。 – TobiMcNamobi 2018-02-08 12:23:47

+0

@TobiMcNamobi,我没有访问VS 2017.希望你从另一个来源得到你的答案。 – 2018-02-08 16:52:33