【问题标题】:swap with non-const reference parameters与非常量引用参数交换
【发布时间】:2014-12-06 06:05:50
【问题描述】:

我从“float”类型的右值得到 [错误]“float&”类型的非常量引用的无效初始化

#include <stdio.h>
void swap(float &a, float &b){
    float temp=a;
    a=b;
    b=temp;
}
main()
{
    int a=10, b=5;
    swap((float)a, (float)b);
    printf("%d%d",a,b);
}

【问题讨论】:

  • (float)a 创建一个右值,一个右值不能绑定到一个左值引用。您需要将ab 声明为浮点数才能使swap(a, b) 工作。
  • main() 必须是 int main()

标签: c++ swap


【解决方案1】:

Vlad 是正确的,为什么要转换为 float?对所有值使用int。但是,如果您有某些理由这样做,您的castreferences 必须保持一致:

#include <stdio.h>

void swap(float *a, float *b){
    float temp=*a;
    *a=*b;
    *b=temp;
}

int main()
{
    int a=10, b=5;
    swap((float*)&a, (float*)&b);
    printf("\n%d%d\n\n",a,b);
    return 0;
}

输出:

$ ./bin/floatcast

510

当您将地址传递给函数时,它必须将pointer 作为参数。因此void swap(float *a,.. 当你需要一个reference 到一个变量的地址时(作为pointer 传递),你使用address of 操作符&amp;。当您处理作为pointer 传递的值时,为了对pointer 指向的values 进行操作,您必须使用dereference 指针使用* 运算符。把所有这些放在一起,你就得到了上面的代码。 (更容易使用int...:)


C++ 参考

如果我理解你想要的评论,你想要这样的东西:

#include <iostream>

// using namespace std;

void swap(float& a, float& b){
    float temp=a;
    a=b;
    b=temp;
}

int main()
{
    int a=10, b=5;
    swap ((float&)a, (float&)b);
    std::cout << std::endl << a << b << std::endl << std::endl;
    return 0;
}

输出:

$ ./bin/floatref

510

【讨论】:

  • 它正在工作......但是如果我想使用 swap(float &, float &) 会怎样?
  • 我很困惑。你不能使用float &amp;,因为在你使用&amp;之后你不再有float你有an address of a float这是一个pointer to a float所以你必须使用float *
  • @DavidC.Rankin:这是一个 C++ 参考。
  • @DracudaKid Uugh -- 我第一次是对的我很困惑float &amp; 是什么意思?你是说想要cast 那样的东西,或者获取某物的地址,或者以其他方式使用它?谢谢本杰明。
  • float&amp;,他的意思是他想引用一个浮点数。 C++ 引用类似于指针,但更像是别名。也就是说,引用的使用在语法上与所指的使用相同。它允许你做类似swap(a, b) 的事情,它实际上会交换ab 的值,而不是必须做swap(&amp;a, &amp;b)。有关示例,请参阅 Vlad 答案中的第一个交换实现。
【解决方案2】:

您正在尝试交换临时对象(由于使用转换而创建)。此外,退出交换后将被删除。您不能将临时对象与非常量引用绑定。所以这样的呼唤毫无意义。完全不清楚为什么您要尝试将两个整数都转换为浮动以交换它们。为什么不自己交换整数?

像这样写函数

void swap( int &a, int &b )
{
    int temp = a;
    a = b;
    b = temp;
}

考虑到已经有标准函数std::swap

如果你想用 C 编写交换函数,那么它看起来像

void swap( int *a, int *b )
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

【讨论】:

  • 我只想使用 swap (float,float) 因为我还需要交换浮点类型
  • @DracudaKid 您可以在 C++ 中重载该函数。因此,您将拥有两个具有相同名称的函数。或者你可以像标准函数一样编写模板函数,或者使用标准函数swap本身。在 C 中,您必须重命名其中一个函数。
【解决方案3】:

您必须使用指针(*)获取数组。仅通过时,您必须提供与号(&)。使用以下代码。

#include <stdio.h>
void swap(int* a, int *b){
float temp=*a;
*a=*b;
*b=temp;
}
main()
{
 int a=10, b=5;
 swap(&a, &b);
 printf("%d \t %d\n",a,b);
}

【讨论】:

    【解决方案4】:

    在 C++ 中,您应该使用 std::swap,或者如果您愿意,您可以编写自己的模板来交换任意两个值。

    template <typename T>
    void swap(T & a, T & b)
    {
        T temp = a;
        a = b;
        b = temp;
    }
    
    int main() {
        int a = 10, b = 5;
        swap(a, b);
        std::cout << a << " \t " << b << std::endl;
        return 0;
    }
    

    您要完成的工作(将int 视为float)将导致未定义的行为——它可能适用于您的编译器,但很容易在不同的编译器或架构上中断。如果您真的愿意,可以使用reinterpret_cast 强制执行此行为。

    【讨论】:

      猜你喜欢
      • 2011-06-09
      • 1970-01-01
      • 2020-10-04
      • 2021-12-14
      • 2010-09-27
      • 2020-12-31
      • 2019-02-05
      • 2011-03-27
      相关资源
      最近更新 更多