从C++向C传递基本类型引用是否属于未定义行为?
关于C++向C函数传递基本类型引用的行为疑问
我想了解从C++向C传递int或float等基本类型引用的行为:被调用的C函数期望接收int类型,但我传入int&,这种行为是否有明确定义?
编译器显然能识别类型不匹配,但即使开启所有警告也未收到提示。这是否是因为在表达式求值时int&被当作int处理?
我尝试运行以下代码,未得到任何错误或警告,编译器直接通过,程序输出了预期的42,但这是因为编译器兼容处理,还是该操作本身合法?
测试代码
foo.h
#ifdef __cplusplus extern "C" { #endif void foo(int x); #ifdef __cplusplus } #endif
foo.c
#include "foo.h" #include <stdio.h> void foo(int x) { printf("%d\n", x); }
main.cpp
#include "foo.h" int main() { int i = 42; int& r = i; foo(r); }
解答
这种行为是完全合法且符合C++标准定义的,并非编译器的兼容处理。
原因在于:在C++表达式中使用引用变量时,会自动发生隐式的左值到右值转换(即自动解引用),引用会被当作它所绑定的对象本身来处理。当你把int&类型的r传给期望int参数的函数时,编译器会自动将引用转换为它指向的int对象的值,相当于你传递的是i本身的副本——这和直接调用foo(i)的效果完全一致。
至于为什么没有警告,根本原因是这里不存在类型不匹配:在函数调用的参数求值阶段,int&已经被转换为int类型,和C函数foo的参数类型完全匹配,所以编译器不会发出任何警告。
C++标准明确规定,引用在表达式中使用时,会被视为其绑定的对象的别名,除了少数特殊场景(比如使用decltype或者取地址操作&r),其他情况下引用都会被自动解引用为对应的对象类型。
内容的提问来源于stack exchange,提问作者Gideon Geier
相关产品推荐
相关产品推荐

