在C++中引用未初始化变量的安全性

Safety with referencing uninitalized variables in C++

本文关键字:变量 安全性 初始化 C++ 引用      更新时间:2023-10-16

(假设在上面的代码行中包含/namespace std/protots)

1) 创建对未初始化的已声明变量的引用是否安全?

在第2行中声明myVariable,然后myRef被设置为引用第3行中未初始化的myVariable

这是不该做的事吗?

1- int main(){
2-     string myVariable;
3-     string& myRef = myVariable;
4- {

2) 通过将未初始化的变量作为函数的引用进行传递来初始化它是否安全?

myVar在第2行声明,然后在第3行初始化,但它在函数askText中使用未初始化的自身作为自变量。在第3行('7')的函数中,引用text_to_initialize最终给myVar一个值。

在第3行中用自己作为论据来初始化是否安全?

1- int main(){
2-     string myVar;
3-     myVar = inputText(myVar);
4- }
5- 
6- string inputText(string& text_to_initialize){
7-     cin >> text_to_initialize;
8-     return (text_to_initialize + "!");
8- }

以上所有内容都可以,因为它们都没有对不确定值执行左值到右值的转换。甚至允许在初始化完成之前,通过非平凡的初始化将引用绑定到变量。

规则见第8.5节:

如果没有为对象指定初始值设定项,则默认初始化该对象。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有一个不确定的值,如果没有对该对象执行初始化,则该对象将保留一个不确定性值,直到该值被替换(5.17)。[注:具有静态或线程存储持续期的对象被初始化为零,请参阅3.6.2--结束语]如果评估产生了不确定的值,则行为是未定义的,以下情况除外:

并且这些情况涉及到窄字符类型,因此在这里不适用。重要的是,任何求值都不会产生不确定的值(这将是左值到右值转换的结果)。

正如John所指出的,在您的特定情况下,std::string的默认初始化不是"无初始化",因此您甚至没有一个不确定的值。但是,即使对于没有默认初始化的基元类型,您也可以。