C++ g++;当int类型的签名不';不匹配

C++ g++;当int类型的签名不';不匹配,c++,gcc,compiler-errors,g++,type-promotion,C++,Gcc,Compiler Errors,G++,Type Promotion,如果我从一个示例程序开始,这是最简单的。(注意:我的问题不是关于如何修复此程序。如果您的答案只是关于如何修复此程序而不是关于我的问题,请不要回答。) 当然这里的问题是,f想要将一个有符号的int作为引用,而我试图将一个无符号的int传递给它 但是,来自g++的编译器警告令人迷惑: <source>: In function 'int main(int, char**)': <source>:7:5: error: cannot bind non-const lvalue

如果我从一个示例程序开始,这是最简单的。(注意:我的问题不是关于如何修复此程序。如果您的答案只是关于如何修复此程序而不是关于我的问题,请不要回答。)

当然这里的问题是,
f
想要将一个有符号的int作为引用,而我试图将一个无符号的int传递给它

但是,来自g++的编译器警告令人迷惑:

<source>: In function 'int main(int, char**)':

<source>:7:5: error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'

    7 |   f(x);

      |     ^

<source>:1:13: note:   initializing argument 1 of 'void f(int&)'

    1 | void f(int &x) { x = 1; }

      |        ~~~~~^

问题:这里发生了什么?我假设编译器必须尝试转换以查看它是否有帮助和失败,但是错误消息会在这个过程的中途发出并且不会引用原始类型是毫无意义的。

您必须将
unsigned int
的地址传递给
函数

void f(int *x) { *x = 1; }

int main(int, char **)
{
  unsigned int x;

  f(&x);

  return 0;
}

当您传递
无符号int
时,此程序仍然会给您一个错误,因为函数只接受
int
,您必须将
无符号int
的地址传递给
函数

void f(int *x) { *x = 1; }

int main(int, char **)
{
  unsigned int x;

  f(&x);

  return 0;
}

当您传递
无符号int
时,此程序仍然会给您一个错误,因为函数只接受
int
,您不能将另一种数据类型的地址传递给函数

在发送其地址之前,必须将指针类型转换为
无符号int

void f(int *x) { *x = 1; }

int main(int, char **)
{
    unsigned int x;

    f(reinterpret_cast<int *>(&x));

    return 0;
}

不能将另一数据类型的地址传递给函数

在发送其地址之前,必须将指针类型转换为
无符号int

void f(int *x) { *x = 1; }

int main(int, char **)
{
    unsigned int x;

    f(reinterpret_cast<int *>(&x));

    return 0;
}

这是C++,不是C。你可以通过引用。这是C++,不是C。你可以通过引用。也许GCC试图把<代码>主< <代码>变量>代码> x>代码>转换成<代码> int >代码>,但是它确实是一个不能绑定到非const LValk引用的r值,因此是错误。你使用的是哪种版本的GCC?你有没有尝试过其他版本(例如在上)?@Someprogrammerdude:看起来在gcc 5之前,它实际上提供了一个更有用的信息。这是否回答了你的问题。具体来说:
一个非常量引用参数,例如int&,只能引用一个“左值”,它是一个命名变量。
在您的情况下,要么将两个声明都更改为“int”,要么将两个声明都更改为“unsigned int”。@paulsm4:不。我的问题不是如何修复程序,我的问题是关于错误消息。也许GCC试图将
main
变量
x
转换为
int
,但它确实是一个不能绑定到非常量左值引用的右值,因此会出现错误。您使用的是哪个版本的GCC?你有没有尝试过其他版本(例如在上)?@Someprogrammerdude:看起来在gcc 5之前,它实际上提供了一个更有用的信息。这是否回答了你的问题。具体来说:
一个非常量引用参数,例如int&,只能引用一个“左值”,它是一个命名变量。
在您的情况下,要么将两个声明都更改为“int”,要么将两个声明都更改为“unsigned int”。@paulsm4:不。我的问题不是如何修复程序,我的问题是关于错误消息。我的问题不是关于如何修复程序,我的问题是关于错误消息。我的问题不是关于如何修复程序,我的问题是关于错误消息。
void f(int &x) { x = 1; }

int main(int, char **)
{
    unsigned int x;

    f((int&)x);

    return 0;
}