在C++中引用未初始化变量的安全性
Safety with referencing uninitalized variables in C++
(假设在上面的代码行中包含/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
的默认初始化不是"无初始化",因此您甚至没有一个不确定的值。但是,即使对于没有默认初始化的基元类型,您也可以。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 类与私有变量的其他类之间的线程安全性
- 线程安全性和静态变量/成员功能
- 静态变量初始化的线程安全性
- 局部变量的安全性
- 在C++中引用未初始化变量的安全性
- c++ 11堆栈变量的线程安全性