通过引用传递的值的引用
Reference of value passed by reference
本文关键字:引用 更新时间:2023-10-16
我不知何故开始尝试理解C++并与"未定义","未指定"混淆。
参考文献被广泛记录,但我没有找到我的"特定"问题的答案。
通过引用传递的值的引用呢?
我已经使用以下代码对此进行了测试:
#include <iostream>
int func(int& a)
{
int b=a;
++b;
std::cout << "[func] b: " << b << std::endl;
return b;
}
int func2(int& a)
{
int& b=a;
++b;
std::cout << "[func2] b: " << b << std::endl;
return b;
}
int main()
{
int a=1;
std::cout << "a: " << a << std::endl;
func(a);
std::cout << "a after func: " << a << std::endl;
func2(a);
std::cout << "a after func2: " << a << std::endl;
return 0;
}
并得到输出:
a: 1
[func] b: 2
a after func: 1
[func2] b: 2
a after func2: 2
它似乎做了我所期望的,但这是标准规定的行为吗?
从最新的公共标准草案中,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf:
8.5.3 参考文献 [dcl.init.ref] 1 声明为 T&或 T&&&的变量,即"对类型 T 的引用"(8.3.2),应由 T 类型的对象或函数或可以 转换为 T. [ 示例:
int g(int);
void f() {
int i;
int& r = i; // r refers to i
r = 1; // the value of i becomes 1
int* p = &r; //p points to i
int& rr = r; // rr refers to what r refers to, that is, to i
[...]
因此,虽然这句话可能会让人不确定(这里相关的部分可能是引用"可以转换为 T"),但示例(最后一行在这里相关)是明确的。
是的,这是标准行为。
当你通过引用传递某些东西时 - 你实际上只是为变量分配了一个额外的名称。
喜欢-
当你从main使用func(a)调用func2(int&a)时,你正在为main中定义的变量"a"分配一个新名称。主变量 'a' 在 func2 中以名称 'a' 而闻名。基本上 fun2::a 和 main::a 指的是相同的变量。
另外,当你这样做时int & b=a;在 func2 中,您将为 func2::a ->func2::b 创建一个新名称。因此,变量保持不变,只添加了新名称。
您可以从以下链接
中找到很好的答案http://www.stroustrup.com/bs_faq2.html#undefined
未定义、未指定和实现定义的行为
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何引用基类的派生类?