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