传递引用未初始化变量是未定义的行为吗?
Is it undefined behavior to pass-by-reference uninitialized variable?
我有以下代码:
#include <iostream>
void f(int &x) {
x = 5;
}
int main() {
int x;
f(x);
std::cout << x << std::endl;
return 0;
}
此代码是否调用了 C++ 中的未定义行为? g++ 在没有任何警告的情况下编译它,并且代码打印出 5
(如预期的那样?)。
此代码中没有未定义的行为。 使用未初始化的变量在赋值之前是未定义的,但是传递引用并通过引用执行赋值是明确定义的。
不,这不会调用未定义的行为,预期的打印值为 5。
由于您将函数声明为 void f(int& x)
,因此 int&
是引用类型并更改它绑定到的变量的值并且不复制它。
注意什么是带有引用的未定义行为的真实示例:
int& f() {
int x = 5;
return x; //return a reference of a variable that will not exist
//after f finished
}
int main() {
std::cout << f() << std::endl; //undefined behavior
}
这是未定义的行为,因为引用不负责保持它们引用的分配数据有效,引用只是更改并读取有效的值。所以在 f()
完成后,引用将指向无效内存。
当计算产生不确定的值时,会发生未定义的行为,但有少数例外(请参阅 C++14 标准的§8.5/12)。
在这种情况下,x
的值在 x
被赋值后才会被使用,所以这段代码没有问题。不访问 x
的值以将引用绑定到它。 (但是,请注意:int
也可以绑定到 const double&
,在这种情况下,将访问值 ,而新的临时 double
对象将从该值创建。)
我有以下代码:
#include <iostream>
void f(int &x) {
x = 5;
}
int main() {
int x;
f(x);
std::cout << x << std::endl;
return 0;
}
此代码是否调用了 C++ 中的未定义行为? g++ 在没有任何警告的情况下编译它,并且代码打印出 5
(如预期的那样?)。
此代码中没有未定义的行为。 使用未初始化的变量在赋值之前是未定义的,但是传递引用并通过引用执行赋值是明确定义的。
不,这不会调用未定义的行为,预期的打印值为 5。
由于您将函数声明为 void f(int& x)
,因此 int&
是引用类型并更改它绑定到的变量的值并且不复制它。
注意什么是带有引用的未定义行为的真实示例:
int& f() {
int x = 5;
return x; //return a reference of a variable that will not exist
//after f finished
}
int main() {
std::cout << f() << std::endl; //undefined behavior
}
这是未定义的行为,因为引用不负责保持它们引用的分配数据有效,引用只是更改并读取有效的值。所以在 f()
完成后,引用将指向无效内存。
当计算产生不确定的值时,会发生未定义的行为,但有少数例外(请参阅 C++14 标准的§8.5/12)。
在这种情况下,x
的值在 x
被赋值后才会被使用,所以这段代码没有问题。不访问 x
的值以将引用绑定到它。 (但是,请注意:int
也可以绑定到 const double&
,在这种情况下,将访问值 ,而新的临时 double
对象将从该值创建。)