首先,这是来自“使用C ++进行编程,原理和实践”一书的练习题。这些书故意告诉我编写这些功能,以了解为什么某些行会引起问题。因此,更改代码不是一种选择。
我能够将双精度变量或双精度文字作为参数传递给使用按值传递(int参数)的swap_v函数。
我无法将双精度变量或双精度文字作为参数传递给使用按引用传递(int&参数)的swap_r函数。当我使用按值传递时,它起作用。
两行都给出这三个错误。
1-无法使用类型为“ double”的值初始化类型为“ int&”的引用(非常量限定)
2-对非常量的引用的初始值必须是左值
3-'void swap_r(int&,int&)':无法将参数1从'double'转换为'int&'
#include <iostream>
void swap_v(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void swap_r(int& a, int& b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
/*
int x = 7;
int y = 9;
swap_v(x, y); // Doesnt swap
swap_v(7, 9); // Cant swap literals.
const int cx = 7;
const int cy = 9;
swap_v(cx, cy); // Doesnt swap
swap_v(7.7, 9.9); // Cant swap literals.
double dx = 7.7;
double dy = 9.9;
swap_v(dx, dy); // Doesnt swap
swap_v(7.7, 9.9); // Cant swap literals.
*/
int x = 7;
int y = 9;
swap_r(x, y); // Swaps
// Doesnt compile. You have to pass variables when using pass by reference.
//swap_r(7, 9);
const int cx = 7;
const int cy = 9;
// Doesnt compile. You cant change constant values.
//swap_r(cx, cy);
// Doesnt compile. You have to pass variables when using pass by reference.
//swap_r(7.7, 9.9);
double dx = 7.7;
double dy = 9.9;
// ???
swap_r(dx, dy);
// ???
swap_r(7.7, 9.9);
}
您可以从int
获得double
,但不能从int&
获得double
。
简而言之,以下是什么。在这里:
void foo(int x) {}
double y = 5.0;
foo(y);
[y
不是int
,但可以将double
转换为int
,所以基本上您有这个(不是真的,只是为了说明):
double y = 5.0;
int temp = y;
foo(y);
临时int
被传递给该函数。现在,如果函数引用了,则不能执行
void bar(int& X) {}
bar(5);
因为无法将5
绑定到非常量引用。那是什么意思?您无法更改5
的值。类似地,从上述int
转换而来的double
只是暂时的,将其作为非常量引用传递是没有意义的。同样,这不是真正发生的情况,但是它说明了“问题”:
void bar(int& X) {}
double y = 5.0;
int x = y;
bar(x);
bar
将修改x
,但这对y
没有影响。因为这真的不是转换的工作方式(您的代码中没有明确显示int x=y;
),所以编译器也禁止您这样做
double y = 5.0;
bar(y);
PS考虑一下,如果允许这样的事情会令人困惑:
void half(int& x) { x /= 2; }
double x = 3.2;
half(x);
x
现在是什么? 1.6
? 1
?从double
到int
的转换不是问题,但是您将如何取回double
?显然,如果允许这样的事情,将会引起混乱,而不是有所帮助。
此行:
swap_r(7.7, 9.9);
无法编译,因为编译器期望变量引用,并且您将其传递为文字,因此无法完成。
所有错误都与此有关。