《C++避坑神器·十二》函数返回值不能被赋值问题

简介: 《C++避坑神器·十二》函数返回值不能被赋值问题

技术细节

函数返回值是右值,右值是把值赋给别人的不是被别人赋值的,左值才是被别人赋值的

Int fun();

fun() = 10; //这样写错误,右值不可以被赋值,想要函数作为左值,返回值只能是引用,那为什么返回值是指针也能被赋值?返回值是指针并不是函数可以作为左值,函数依然是右值,返回的指针是右值,不可以对指针进行赋值,但可以对指针指向的内容进行赋值。

typedef struct Person
{
  string name;
  int age;
}person;
person fun(person p)
{
  return p;
}
int main(void)
{
  person p;
  fun(p).age = 20;
  return 0;
}

fun§.age = 20;这条会报错:表达式必须是可修改的左值。

函数返回一个结构体,因返回值是右值故不可以对结构体内的变量进行修改,如果返回值为mode&或者mode*这样就可以。

typedef struct Person
{
  string name;
  int age;
}person;
person* fun(person* p)
{
  return p;
}
int main(void)
{
  person p[2];
  fun(p)->age = 20; //允许
  fun(p) = &p[1];  //不允许,返回值为指针不可以作为左值被赋值
  return 0;
}

函数返回值为指针,指针作为右值不可以被赋值,但可以对指针指向的内容进行赋值。

typedef struct Person
{
  string name;
  int age;
}person;
person& fun(person& p)
{
  return p;
}
int main(void)
{
  person p[2];
  fun(p[0]).age = 20; //允许,返回值为引用可以作为左值
  fun(p[0]) = p[1];  //允许,返回值为引用可以作为左值
  return 0;
}


相关文章
|
3天前
|
自然语言处理 编译器 C语言
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
本文章是我对C++学习的开始,很荣幸与大家一同进步。 首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
30 1
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
|
4天前
|
存储 算法 对象存储
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
14 1
|
4天前
|
存储 算法 数据安全/隐私保护
【C++入门到精通】 哈希结构 | 哈希冲突 | 哈希函数 | 闭散列 | 开散列 [ C++入门 ]
【C++入门到精通】 哈希结构 | 哈希冲突 | 哈希函数 | 闭散列 | 开散列 [ C++入门 ]
7 0
|
4天前
|
存储 自然语言处理 C++
刷题用到的非常有用的函数c++(持续更新)
刷题用到的非常有用的函数c++(持续更新)
12 1
|
5天前
|
存储 编译器 C++
【C++】内存管理和模板基础(new、delete、类及函数模板)
【C++】内存管理和模板基础(new、delete、类及函数模板)
21 1
|
11天前
|
存储 C++
c/c++宏定义(函数)
c/c++宏定义(函数)
|
12天前
|
编译器 C++ 索引
【C++类和对象】拷贝构造与赋值运算符重载(下)
【C++类和对象】拷贝构造与赋值运算符重载
|
4天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
14 0
|
5天前
|
C语言 C++
【C++】string类(常用接口)
【C++】string类(常用接口)
13 1
|
2天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1