为什么新变量的初始化本身有效
Why is initialization of a new variable by itself valid?
考虑一些代码:
#include <iostream>
int main()
{
using std::cout;
int a=3;
cout << "a="<<a<<"n";
{
int a=a;
cout << "new a = " << a << "n";
a=5;
cout << "a = " << a << "n";
}
cout << "old a = " << a << "n";
}
我希望它能打印
a=3
new a = 3
changed a = 5
old a = 3
但我得到的实际上似乎在第二行中说new a = 0
。我认为它会像类构造函数中的初始化列表一样工作,在那里可以写成
C::C(int a) : a(a) {}
但出于某种原因,这是不同的。首先,完全删除外部代码不会导致编译错误。所以我假设int a=a;
是有效的。打开所有编译器警告会导致以下结果:
test.cpp: In function ‘int main()’:
test.cpp:10:15: warning: ‘a’ is used uninitialized in this function
int a=a;
所以我现在的问题是:为什么这种语法有效?为什么编译器不说"未定义的变量a"之类的东西?
它在语法上是有效的,因为变量的声明点在其初始化器之前,并且该名称在该点之后的任何位置都可用。这允许不那么狡猾的初始化,例如
void *p = &p;
合法地使用正在初始化的变量的名称(但不是值)。
它在行为上是无效的,因为使用未初始化对象的值会产生未定义的行为。这不是一个需要诊断的错误(因为,一般来说,分析程序流以查看对象是否已初始化可能很困难或不可能),但正如你所注意到的,许多编译器会针对这样的简单情况发出警告。
相关文章:
- 为什么这种直接初始化有效?(C++17)
- 在C++中初始化向量映射的最有效方法
- 有效地初始化 const std::vector 类成员
- 有没有办法自动初始化 std::shared_ptr 来保存有效对象?
- 让构造函数在其初始化列表中调用同一类的另一个构造函数是否有效
- 如何有效地初始化大型类的对象
- 实施C 模板列表类的有效初始化
- static_assert未初始化的具有有效专用化的模板类中
- 为什么即使尚未初始化,获取字符串[0]也是有效的?
- 如何在函数中初始化矩阵并在C++中有效地返回它
- 具有从特定范围的随机数初始化特征矩阵或向量初始化特征矩阵或向量的有效方法
- 使用大型数据集初始化类成员向量的最有效方法
- 添加和初始化新std::map元素的最有效方法是什么
- 使用类型推断声明变量是否与"classical way"变量名称后用括号初始化变量一样有效?
- 在外部功能中具有一个变量初始化或内部功能中的多个初始化是最有效的
- 空字符数组的初始化是否有效
- WaitCommEvent 在启动时不会返回(当通过 MatLAB 初始化 COMPort 时有效)
- 具有未初始化成员的结构的constexpr默认构造函数仅在模板化时有效
- 通过写入全局llvm的地址从执行引擎外部初始化全局llvm值有效吗
- 为什么通过右值初始化非常量引用有效(在 C++11 中)