int参数和int¶meter的双参数 这是一本从C++编程、原理和实践中练习出来的问题。书中特意告诉我写这些函数,以理解为什么有些行会导致问题。因此,更改代码不是一个选项

int参数和int¶meter的双参数 这是一本从C++编程、原理和实践中练习出来的问题。书中特意告诉我写这些函数,以理解为什么有些行会导致问题。因此,更改代码不是一个选项,c++,pass-by-reference,pass-by-value,C++,Pass By Reference,Pass By Value,我可以将双变量或双文本作为参数发送给swap_v函数,该函数使用传递值int参数 我无法将双变量或双文本作为参数发送到使用按引用传递int¶meters的swap\r函数。当我使用“按值传递”时,它会起作用 这两行都给出了这3个错误 1-类型为int¬ const qualified的引用不能用类型为double的值初始化 2-引用非常量的初始值必须是左值 3-“void swap\u rint&,int&”:无法将参数1从“double”转换为“int&” #include &l

我可以将双变量或双文本作为参数发送给swap_v函数,该函数使用传递值int参数

我无法将双变量或双文本作为参数发送到使用按引用传递int¶meters的swap\r函数。当我使用“按值传递”时,它会起作用

这两行都给出了这3个错误

1-类型为int¬ const qualified的引用不能用类型为double的值初始化

2-引用非常量的初始值必须是左值

3-“void swap\u rint&,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);
}
这一行:

swap_r(7.7, 9.9);
无法编译,因为编译器需要一个变量引用,而您向它传递了一个文本,这无法完成。因此出现了错误:

非常量引用的初始值必须是左值

您也不能将双重引用传递给&int引用(&D),因此

swap_r(dx, dy);
将双变量引用传递给int引用参数时,编译失败,错误如下:

int类型的引用¬ const qualified不能用double类型的值初始化

void swap_rint&,int&':无法将参数1从“double”转换为“int”&

这一行:

swap_r(7.7, 9.9);
无法编译,因为编译器需要一个变量引用,而您向它传递了一个文本,这无法完成。因此出现了错误:

非常量引用的初始值必须是左值

您也不能将双重引用传递给&int引用(&D),因此

swap_r(dx, dy);
将双变量引用传递给int引用参数时,编译失败,错误如下:

int类型的引用¬ const qualified不能用double类型的值初始化

void swap_rint&,int&':无法将参数1从“double”转换为“int”&

可以从double得到int,但不能从double得到int

简而言之,这里发生的情况如下:

void foo(int x) {}

double y = 5.0;
foo(y);
y不是int,但是double可以转换成int,所以基本上你没有这个,只是为了说明:

double y = 5.0;
int temp = y;
foo(temp);
将临时int传递给函数。现在,如果函数接受引用,则无法执行此操作

void bar(int& X) {}

bar(5);
因为不能将5绑定到非常量引用。那是什么意思?不能更改5的值。类似地,从上面的double转换得到的int只是临时的,将其作为非常量引用传递是没有意义的。同样,这并不是真正发生的事情,但它说明了问题:

void bar(int& X) {}

double y = 5.0;
int temp = y;
bar(temp);
条形图将修改温度,但这对y没有影响。因为这真的不是转换的工作原理,你没有int temp=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呢?显然,如果这样的事情被允许的话,它将导致更多的混乱,而不是帮助

PPS交换不是您应该编写的函数。使用std::swap代替。

可以从双精度计数器中获取int,但不能从双精度计数器中获取int&值

简而言之,这里发生的情况如下:

void foo(int x) {}

double y = 5.0;
foo(y);
y不是int,但是double可以转换成int,所以基本上你没有这个,只是为了说明:

double y = 5.0;
int temp = y;
foo(temp);
将临时int传递给函数。现在,如果函数接受引用,则无法执行此操作

void bar(int& X) {}

bar(5);
因为不能将5绑定到非常量引用。那是什么意思?不能更改5的值。类似地,从上面的double转换得到的int只是临时的,将其作为非常量引用传递是没有意义的。同样,这并不是真正发生的事情,但它说明了问题:

void bar(int& X) {}

double y = 5.0;
int temp = y;
bar(temp);
条形图将修改温度,但这对y没有影响。因为这真的不是转换的工作原理,你没有int temp=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呢?显然,如果这样的事情被允许的话,它将导致更多的混乱,而不是帮助


PPS交换不是您应该编写的函数。使用std::swap代替。

您的代码有几个问题。首先,函数void swap_vint a,int b是无用的,因为交换发生在函数范围内,但不会更改函数范围外的值

另一个问题是,函数需要int或int&类型的参数,但传递的却是double。这将编译 但当值转换为int时,它将截断值。您可以重载函数或使用模板:

void swap_v(int a, int b) {...} // Gets called for ints
void swap_v(double a, double b) {...} // Gets called for doubles
template <typename T> void swap_v(T a, T b){...} // Works for all types
您需要将函数的签名更改为void swapconst int&a、const int&b以使其进行编译,但这没有任何意义,因为您不能在函数外部使用传递的值

因此,您的问题的解决方案可能是以下函数:

template <typename T>
void swap(T& a, T& b)
{
    T temp = std::move(a);
    a = std::move(b);
    b = std::move(temp);
}

您的代码有几个问题。首先,函数void swap_vint a,int b是无用的,因为交换发生在函数范围内,但不会更改函数范围外的值

另一个问题是,函数需要int或int&类型的参数,但传递的却是double。这将进行编译,但会在值转换为int时截断值。您可以重载函数或使用模板:

void swap_v(int a, int b) {...} // Gets called for ints
void swap_v(double a, double b) {...} // Gets called for doubles
template <typename T> void swap_v(T a, T b){...} // Works for all types
您需要将函数的签名更改为void swapconst int&a、const int&b以使其进行编译,但这没有任何意义,因为您不能在函数外部使用传递的值

因此,您的问题的解决方案可能是以下函数:

template <typename T>
void swap(T& a, T& b)
{
    T temp = std::move(a);
    a = std::move(b);
    b = std::move(temp);
}

文字是常量。无论您在哪里看到3.1415,您都希望它的值为3.1415,因此编译器不允许您将其值与其他值交换

const的含义是您指定一个值,例如Pi到3.1415。因此,cx和cy是常量,而不是变量,因此它们的值不能变化

它将不允许您使用double调用swap\r,因为如果不引入违反直觉的行为,它将无法这样做。假设它将dx转换为值为7的int,dy转换为值为9的int,交换它们,然后将它们转换回double。与其让dx包含9.9,dy包含7.7,不如让它们包含9和7,这不是一个通情达理的人所期望的


该语言确实允许通过将双精度数转换为临时常量整数来交换v。这些常量可以通过值作为int传递,但不能通过引用作为变量传递,因为它们会在语句末尾消失,这是违反直觉的。换句话说,您不希望swap什么也不做,因为编译器会扔掉它从变量中创建的临时值。

文本是常量。无论您在哪里看到3.1415,您都希望它的值为3.1415,因此编译器不允许您将其值与其他值交换

const的含义是您指定一个值,例如Pi到3.1415。因此,cx和cy是常量,而不是变量,因此它们的值不能变化

它将不允许您使用double调用swap\r,因为如果不引入违反直觉的行为,它将无法这样做。假设它将dx转换为值为7的int,dy转换为值为9的int,交换它们,然后将它们转换回double。与其让dx包含9.9,dy包含7.7,不如让它们包含9和7,这不是一个通情达理的人所期望的


该语言确实允许通过将双精度数转换为临时常量整数来交换v。这些常量可以通过值作为int传递,但不能通过引用作为变量传递,因为它们会在语句末尾消失,这是违反直觉的。换句话说,您不希望swap什么都不做,因为编译器会扔掉它从变量中创建的临时值。

我无法将双变量或双文本作为参数发送给swap\r函数,该函数使用按引用传递int¶meters。为什么因为双是不是int。@火焰是用它的传递值来工作的。@ BLASE也,C++有不安全的/缩小的转换。当你通过值时,有一个隐式的转换。它不能在引用中这样做。int&必须指int,而不是double。您试图在代码中执行的操作类似于在需要int指针的位置传递double的地址,这只会导致在使用double的任何地方都出现未定义的行为。引用更安全一点,您只会得到这个编译时错误。我无法将双变量或双文本作为参数发送到使用pass-by-reference int¶meters的swap\r函数。为什么因为双是不是int。@火焰是用它的传递值来工作的。@ BLASE也,C++有不安全的/缩小的转换。当你通过值时,有一个隐式的转换。它不能在引用中这样做。int&必须指int,而不是double。您试图在代码中执行的操作类似于在需要int指针的位置传递double的地址,这只会导致在使用double的任何地方都出现未定义的行为。引用更安全一点,只会出现编译时错误。我使用这些交换方法是因为书中要求我练习。谢谢你的回答。我使用这些交换方法是因为这本书要求我练习。谢谢你的回答。