在以下代码中,除了构造函数之外,模板结构BB和CC几乎相同。模板BB使用不执行任何操作的构造函数,而模板CC使用默认构造函数。当我使用Visual Studio 2013 update 4编译它时,在声明constInst2
的行中抛出错误,但在声明constInst
的行上不会抛出错误:
错误C4700:未初始化的局部变量'instance2'使用“
我在初始化'instance'时也预料到同样的错误。我误解了this sentence吗?
“如果未删除隐式声明的默认构造函数或 琐碎的,它被定义(即,生成一个函数体和 由编译器编译),它与a具有完全相同的效果 用户定义的构造函数,包含空主体和空初始化列表。“
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;
}
答案 0 :(得分:1)
Visual Studio中有一个编译器标志,用于将警告视为错误(/ WX)。您可以关闭该标志,不将警告视为错误。您也可以选择忽略特定警告(/ wd4100以禁用警告C4100)。
您所看到的是一个被视为错误的编译器警告。
这与对标准引用的解释无关。
如果是
BB< AA > instance;
编译器不会发出警告消息,因为您可能在具有副作用的构造函数中执行某些操作。编译器选择不深入研究如何实现构造函数的细节来推断调用构造函数是否有副作用。
在
的情况下CC< AA > instance2;
它能够推断出构造对象没有副作用。