函数返回 int&
Function returning int&
我在网上找了一篇试图解释std::move
和右值的文章,发现了一些我真的无法理解的东西。
int i = 42; i = 43; // ok, i is an lvalue int* p = &i; // ok, i is an lvalue int& foo(); foo() = 42; // ok, foo() is an lvalue int* p1 = &foo(); // ok, foo() is an lvalue
int& foo()
的意义是什么?这个例子中的foo() = 42
是什么?
编辑:因为让我困惑的部分和右值没有任何关系,我将写解决我问题的部分:
我不知道你可以在作用域中写函数声明所以int&Foo()变成了一个带空初始化项的int引用,这也是不可能的,因为引用必须指向某些东西。但在最激动的时刻,我吃饱了.......
int& foo()
是一个返回(左值)整数引用的函数。
引用通常被实现为指针,但引用的意义在于编译器通常可以完全删除它们的存在。对于指针来说,这样做通常比较困难,因为它们的标识与它们所指的对象是分开的。
在c++中没有办法获得引用的地址。你可以得到包含引用的结构体的地址,两者非常接近,没有什么区别,但是你不能得到引用本身的地址。 int& foo()
返回对整数的引用。例如:
int x=0, y=0;
bool pick_x=true;
int& foo() { if (pick_x) return x; else return y; }
现在foo
返回对x
或y
的引用,具体取决于pick_x
的状态。
您可以使用foo
的返回值几乎与x
完全相同(如果!pick_x
则为y
)
左值和右值来自c的年代。左值是一个表达式,可以在=
符号的左或右,右值是一个表达式,只能在=
符号的右。
在许多语言中,左值和右值都可以在语法中表示。在c++中,引用的存在意味着表达式的返回值可以是可以赋值的有效对象,而重载operator=
的存在意味着右值有时可以赋值。所以事情变得棘手了。
在c++ 11中,增加了左值引用和右值引用。每个都拒绝绑定到其他类型的表达式。还有转发引用,主要发生在模板类型演绎中。
非const左值引用的语义与普通指针的语义完全相同,只是指针需要*
操作符来解引用,而引用则不需要。
所以你的
int& foo();
foo() = 42;
可以用指针重新表示为
int* foo();
*foo() = 42;
如果你在第二段代码中没有看到任何奇怪或不寻常的东西,那么你应该在第一段代码中也没有看到任何奇怪或不寻常的东西。
例如int i;
int &foo() { return i; }
int *bar() { return &i; }
int main()
{
foo() = 42;
assert(i == 42);
*bar() = 24;
assert(i == 24);
}
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 返回 int 中可被 2 c++ 整除的所有数字的总和
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 我的运算符重载没有在我的 int main 中返回?
- 为什么我不能返回向量<向量<int>>(进程返回 -1073741819 (0xC0000005))
- 如何使用 SWIG 将 C++ int** 返回值给 Python
- 为什么"unsigned int" + "unsigned int"返回"unsigned int"?
- std::sort in vector<int> 返回 0 而不是值
- 使用 static int 返回 int&in 函数
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- int返回垃圾价值
- C++字符串流>> int 返回零
- 为什么numeric_limits::min对int返回负值,而对float/double返回正值?
- 无法将字符串转换为 int 作为回报。在 int 返回函数 getsocial() 中没有声明任何字符串变量
- 在 int 返回函数中返回"false"
- C/ c++程序将输出(int)返回给其他程序