C++ 通过引用传递的强制转换整数类型
如果您有一个整数类型t1,并且函数通过引用得到一个可能更小的整数类型t2,那么调用函数((t2)var_t1)会有问题吗?强制转换将创建一个临时类型,如果较小的类型不通过C++ 通过引用传递的强制转换整数类型,c++,integer,C++,Integer,如果您有一个整数类型t1,并且函数通过引用得到一个可能更小的整数类型t2,那么调用函数((t2)var_t1)会有问题吗?强制转换将创建一个临时类型,如果较小的类型不通过常量引用,那么您的代码将不会编译,因为时间不能绑定到非常量引用 如果它确实通过const引用进行转换,那么它将进行编译,但强制转换可能会导致溢出,这是将较大的数据类型强制转换为较小的数据类型的常见问题。如果且仅当函数采用const引用,则强制转换为t2,在这种情况下,可以将强制转换到t2生成的临时值绑定到它 因为这违背了引用整型
常量
引用,那么您的代码将不会编译,因为时间不能绑定到非常量引用
如果它确实通过
const
引用进行转换,那么它将进行编译,但强制转换可能会导致溢出,这是将较大的数据类型强制转换为较小的数据类型的常见问题。如果且仅当函数采用const引用,则强制转换为t2
,在这种情况下,可以将强制转换到t2
生成的临时值绑定到它
因为这违背了引用整型的目的,我假设引用是非常量的,所以答案是:是的,这会有问题。明确地说,如果您强制转换为t2
,它甚至不会编译
如果希望
函数
仅修改t1
变量的一部分,请在引用/指针上使用重新解释
。当然,从理论上讲,这将调用未定义的行为。函数必须采用const
引用,否则它将无法编译。因为您还标记了问题C,在这种情况下,“by reference”只意味着使用指针,因此您无法将&
运算符应用于强制转换的结果。但是,您可以使用:
function((t2 [1]){ (t2)var });
注意,这是有效的C,但不是C++,这是不应该混合C和C++标签的原因之一……
只是记住,这种行为的不确定性在大Endiad平台上不是很理论,它会修改变量的错误部分。没错,大端平台正在变得越来越稀少,但它们肯定还没有灭绝。没错,但大端平台和小端平台一样,都没有定义。但是如果目标架构已知,结果应该是可预测的,这就是我所说的“理论”的意思。当然,这并不能使它变得更好……C++和C是不同的语言。我已经删除了C标签。