将引用的地址作为指针传递是否会产生未定义行为?
引用取地址传入指针函数是否会触发未定义行为?
结论很明确:你的这段代码完全不会触发未定义行为。
原因很简单:C++里的引用只是原变量的别名,它本身不是一个独立的对象。当你对引用执行&a_ref操作时,编译器会直接返回被引用变量a的内存地址——这和你写&a是完全等价的。
放到你的代码里看:
#include <iostream> using namespace std; void swap(int *x, int *y) { int z = *x; *x = *y; *y = z; } // Driver Code int main() { int a = 45, b = 35; auto& a_ref = a; cout << "a = " << a_ref << " b = " << b << "\n"; swap(&a_ref, &b); // 等价于 swap(&a, &b) cout << "After Swap with pass by pointer\n"; cout << "a = " << a << " b = " << b << "\n"; }
调用swap(&a_ref, &b)时,传入的第一个指针就是a的地址,第二个是b的地址,swap函数内部的指针操作完全合法,最终会正确交换a和b的值,整个过程完全符合C++标准,没有任何未定义的风险。
另外补充一点:虽然不同编译器对引用的实现可能有差异,但C++标准明确规定,对引用取地址的结果就是被引用对象的地址,所以不管在哪种合规的编译器下,这个操作的行为都是确定的。
内容的提问来源于stack exchange,提问作者tesla1060
相关产品推荐
相关产品推荐

