'int&' 类型的非常量引用无效初始化,原因是什么?
invalid initialization of non-const reference of type 'int&', what the reason?
我有给定的代码,但出现错误:
error: invalid initialization of non-const reference of type 'int&'
from an rvalue of type 'int' const int b = f(a++);
^
int f(int& a)
{
return a;
}
int main() {
// your code goes here
int a = 5;
int b = f(a++);
std::cout << b << std::endl;
return 0;
}
此错误的原因是什么?
您不能将临时引用绑定到非常量引用。
Post-increment (a++
) 增加 a
和 returns 临时值 a
的旧值。
你为什么要通过非 const
引用? - 看起来你并没有在函数内部更改参数,只是按值或 const
引用传递。
如果您要更改参数,考虑到 a++
已经更改了参数,您期望行为是什么?这种变化是直观的吗?合法吗?
int
returns 临时值的后缀递增运算符。临时值不能绑定到非常量左值引用,因为修改临时值没有意义。您正在尝试将临时文件绑定到 int&
,这会出错。
要解决此问题,请使用预递增运算符 (++a
),或按值获取参数(最好将内置类型作为值而不是 const T&
传递):
int f(int a)
{
return a;
}
这个函数:
int f(int& a)
接受非常量引用。此类引用必须始终指向驻留在特定内存位置 (*).
的有效对象
Post 增量工作如下:
- save current value as `r`
- increment original variable
- return `r`
那是因为 post-incrementation 的结果是一个临时的,递增前的 yield 值。这种临时必须作为值或常量引用传递:
int f(int a) //This will work
int f(const int& a) //And this
(*) 事实上,旧的编译器允许这样的构造。例如,这段代码将在 VC6 下编译:
struct T {};
void f(T& t)
{
}
int main()
{
f(T());
}
但是,这种行为不符合标准。
我有给定的代码,但出现错误:
error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int' const int b = f(a++); ^
int f(int& a)
{
return a;
}
int main() {
// your code goes here
int a = 5;
int b = f(a++);
std::cout << b << std::endl;
return 0;
}
此错误的原因是什么?
您不能将临时引用绑定到非常量引用。
Post-increment (a++
) 增加 a
和 returns 临时值 a
的旧值。
你为什么要通过非 const
引用? - 看起来你并没有在函数内部更改参数,只是按值或 const
引用传递。
如果您要更改参数,考虑到 a++
已经更改了参数,您期望行为是什么?这种变化是直观的吗?合法吗?
int
returns 临时值的后缀递增运算符。临时值不能绑定到非常量左值引用,因为修改临时值没有意义。您正在尝试将临时文件绑定到 int&
,这会出错。
要解决此问题,请使用预递增运算符 (++a
),或按值获取参数(最好将内置类型作为值而不是 const T&
传递):
int f(int a)
{
return a;
}
这个函数:
int f(int& a)
接受非常量引用。此类引用必须始终指向驻留在特定内存位置 (*).
的有效对象Post 增量工作如下:
- save current value as `r`
- increment original variable
- return `r`
那是因为 post-incrementation 的结果是一个临时的,递增前的 yield 值。这种临时必须作为值或常量引用传递:
int f(int a) //This will work
int f(const int& a) //And this
(*) 事实上,旧的编译器允许这样的构造。例如,这段代码将在 VC6 下编译:
struct T {};
void f(T& t)
{
}
int main()
{
f(T());
}
但是,这种行为不符合标准。