int 类型的符号不匹配时的 g++ 错误消息
g++ error message when signedness of int type doesn't match
如果我只是从一个示例程序开始,这是最简单的。(注意:我的问题是而不是关于如何修复此程序。如果你的答案只是关于如何修复该程序而不是关于我的问题,请不要回复。(
void f(int &x) { x = 1; }
int main(int, char **)
{
unsigned int x;
f(x);
return 0;
}
当然,这里的问题是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; }
| ~~~~~^
如果它从屏幕一侧消失,并且您不想滚动,则错误消息为";无法绑定类型为"int&"的非常量左值引用转换为"int"类型的右值;
我的最佳猜测是,它试图将unsigned int类型的左值隐式转换为int类型的右值,然后陷入了困境。但为什么它会在尝试进行到一半时报告结果呢?为什么它不在此处的任何位置报告类型unsigned int
?
clang明显更有帮助:
<source>:7:3: error: no matching function for call to 'f'
f(x);
^
<source>:1:6: note: candidate function not viable: no known conversion from 'unsigned int' to 'int &' for 1st argument
void f(int &x) { x = 1; }
问题:这里发生了什么?我认为编译器必须尝试转换,看看它是否有帮助并失败,但在这个过程的中途会发出错误消息,并且不会引用原始类型,这是毫无意义的。
您必须将unsigned int
的地址传递给function
。
void f(int *x) { *x = 1; }
int main(int, char **)
{
unsigned int x;
f(&x);
return 0;
}
由于函数只接受int
,因此在传递unsigned int
时,此程序仍会给您一个错误。
不能将另一个数据类型的地址传递给函数。
在发送其地址之前,必须将指针类型转换为unsigned int
。
void f(int *x) { *x = 1; }
int main(int, char **)
{
unsigned int x;
f(reinterpret_cast<int *>(&x));
return 0;
}
或
void f(int &x) { x = 1; }
int main(int, char **)
{
unsigned int x;
f((int&)x);
return 0;
}
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'