int参数和int&参数的双参数

问题描述 投票:0回答:2

首先,这是来自“使用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);
}
c++ pass-by-reference pass-by-value
2个回答
2
投票

您可以从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.61?从doubleint的转换不是问题,但是您将如何取回double?显然,如果允许这样的事情,将会引起混乱,而不是有所帮助。


0
投票

此行:

swap_r(7.7, 9.9);

无法编译,因为编译器期望变量引用,并且您将其传递为文字,因此无法完成。

所有错误都与此有关。

请参见https://wandbox.org/permlink/9o1c1tTW39E1WjF5

© www.soinside.com 2019 - 2024. All rights reserved.