C++ 如果一个函数返回一个int,可以给它分配一个int吗?

C++ 如果一个函数返回一个int,可以给它分配一个int吗?,c++,function,rvalue,C++,Function,Rvalue,如果一个函数返回一个int,它可以被一个int值赋值吗?我认为给函数赋值没有多大意义 int f() {} f() = 1; 我注意到,如果函数返回一个int的引用,那么就可以了。是否仅限于int?其他类型的呢?还是其他规则 int& f() {} f() = 1; 它不仅限于int,但对于基本类型来说,这样做没有意义。当您有自己的类时,它很有用第一个函数按值返回一个整数,这是一个r值。一般情况下,不能指定r值。第二个f()返回对整数的引用,该整数是一个l值,因此您可以将其赋值

如果一个函数返回一个int,它可以被一个int值赋值吗?我认为给函数赋值没有多大意义

int f() {}

f() = 1;
我注意到,如果函数返回一个int的引用,那么就可以了。是否仅限于int?其他类型的呢?还是其他规则

int& f() {}

f() = 1;

它不仅限于int,但对于基本类型来说,这样做没有意义。当您有自己的类时,它很有用

第一个函数按值返回一个整数,这是一个r值。一般情况下,不能指定r值。第二个f()返回对整数的引用,该整数是一个l值,因此您可以将其赋值

int a = 4, b = 5;

int& f() {return a;}

...
f() = 6;
// a is 6 now
注意:您不给函数赋值,只给它的返回值赋值。 请注意以下事项:

int& f() { int a = 4; return a; }
您正在返回对临时变量的引用,该临时变量在函数返回后不再有效。访问引用会调用未定义的行为。

  • 丹尼·卡列夫
  • 丹·萨克斯
  • 米凯尔·基尔佩莱宁

如果函数按值返回对象,则可以赋值,即使函数调用是右值。例如:

std::string("hello") = "world";
这将创建一个临时字符串对象,对其进行变异,然后立即销毁它。一个更实际的例子是:

some_function(++list.begin());

您无法编写
list.begin()+1
,因为在列表迭代器上无法进行添加,但增量是可以的。本例不涉及赋值,但赋值只是更一般规则“可以对右值调用成员函数”的一个特例。

为函数赋值有什么意义?为什么不使用变量?你能解释为什么值返回是一个r值吗?函数的返回值不是一个适当的C++变量,比如<代码> int i;<代码>。它只是一个临时值。它不代表内存位置。@skydoor,可以用“您只能分配给对象”来概括。在您的调用中,函数返回一个与对象不对应的值:整数只表示一个抽象值。例如,如果您返回了一个
std::string
,则返回的值(实际上是一个r值)将对应于一个string对象,您可以为其赋值。
int&
返回值也是如此。在这种情况下,返回的“值”(即l值)对应于一个int对象,您可以分配给它。对象是必需的,因为赋值修改存储状态。你是说返回对基元类型的引用没有意义吗?所以像
vector的
operator[]
这样的东西是没有意义的?这样做有很多意义(如果“it”的意思是返回一个引用)-如果你有一个std::vector,那么访问向量中的东西的函数返回int引用。在他的例子中,这是一个常见的情况吗?你能给我举个例子吗?虽然我知道这只是一个例子,但请注意,
++list.begin()
不需要工作。运算符可以实现为一个自由函数,它接受一个非常量引用,并且将无法临时绑定到迭代器。谢谢,我永远记不起哪些运算符必须成为成员函数,哪些可以是自由函数。