首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有像“显式函数返回类型”这样不需要void类型的规则?

在C++20标准中引入了“显式函数返回类型”的概念,它允许我们在函数定义时显式地指定返回类型,而不再需要使用void类型的规则。这样做的好处是可以提高代码的可读性和可维护性。

使用显式函数返回类型的语法如下:

代码语言:txt
复制
auto functionName() -> returnType {
    // 函数体
}

其中,returnType是函数的返回类型,可以是任意合法的C++类型。

显式函数返回类型的优势在于:

  1. 明确的返回类型:通过显式指定返回类型,可以清晰地表达函数的返回值类型,避免了使用void类型的规则可能带来的歧义。
  2. 提高代码可读性:显式函数返回类型使得代码更加清晰易懂,读者可以直接从函数定义中了解到函数的返回类型,无需查看函数体内的具体实现。
  3. 支持函数重载:显式函数返回类型可以与函数重载一起使用,提供更灵活的函数定义和调用方式。
  4. 与auto关键字结合使用:显式函数返回类型可以与auto关键字结合使用,使得函数的返回类型可以根据具体的实现自动推导,提高了代码的灵活性和可维护性。

显式函数返回类型适用于各种场景,特别是在需要明确函数返回类型的情况下,例如:

  1. 泛型编程:在泛型编程中,函数的返回类型可能依赖于模板参数,使用显式函数返回类型可以更好地表达这种依赖关系。
  2. 函数模板特化:在函数模板特化时,可能需要显式指定特化版本的返回类型,显式函数返回类型可以满足这种需求。
  3. 复杂的类型推导:在某些情况下,函数的返回类型可能无法通过自动推导得出,使用显式函数返回类型可以解决这个问题。

腾讯云提供了丰富的云计算产品和服务,其中与C++开发相关的产品包括云服务器CVM、容器服务TKE、函数计算SCF等。您可以通过以下链接了解更多信息:

  • 云服务器CVM:提供弹性、可靠的云服务器实例,适用于各种应用场景。
  • 容器服务TKE:基于Kubernetes的容器管理服务,提供高可用、弹性伸缩的容器集群。
  • 函数计算SCF:无服务器计算服务,支持按需运行函数代码,无需关心服务器管理。

请注意,以上仅为腾讯云的部分产品示例,更多产品和服务请参考腾讯云官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】泛型编程 ④ ( 函数模板 与 普通函数 调用规则 | 类型自动转换 | 类型自动转换 + 指定泛型类型 )

一、普通函数函数模板 调用规则 - 类型自动转换 1、函数模板和重载函数 定义了 函数模板 , 该 函数模板 可以接收 任意类型参数 T , 但是要求这两个参数类型 T 和 返回类型 T 必须是相同..., 类型调用 必须 指定所有 泛型类型 实际类型 template T add(T a, T b) { cout << "调用函数模板 T add(T a, T...b)" << endl; return a + b; } 此外还定义了 函数模板 重载函数 , 该重载函数 接收两个 int 类型参数 , 同时返回 int 类型返回值 ; // 函数模板...二、普通函数函数模板 调用规则 - 类型自动转换 + 指定泛型类型 1、类型自动转换 + 指定泛型类型 在上面示例前提下 , 如果 传入参数 类型分别是 int 和 char , 并且强行指定...泛型编程 // 定义 T 是泛型类型 // 声明了多个泛型, 可以只使用其中部分类型 // 使用函数模板时 , 类型调用 必须 指定所有 泛型类型 实际类型 template <typename

27750

【C++】泛型编程 ③ ( 函数模板 与 普通函数 调用规则 | 类型匹配 | 指定函数模板泛型类型 )

一、普通函数函数模板 调用规则 - 类型匹配 1、类型匹配 上一篇博客 【C++】泛型编程 ② ( 函数模板与普通函数区别 ) 中 , 分析了 函数参数 类型匹配 下 普通函数函数模板...// 声明了多个泛型, 可以只使用其中部分类型 // 使用函数模板时 , 类型调用 必须 指定所有 泛型类型 实际类型 template T add(T a,...// 使用函数模板时 , 类型调用 必须 指定所有 泛型类型 实际类型 template T add(T a, T b) { cout << "调用函数模板 T...二、普通函数函数模板 调用规则 - 指定函数模板泛型类型 1、指定函数模板泛型类型 如果 函数调用时 , 指定函数模板类型 , 也就是在尖括号 中指定了泛型类型 , 此时 即使...类型调用 必须 指定所有 泛型类型 实际类型 template T add(T a, T b) { cout << "调用函数模板 T add(T a, T b)"

18940
  • 【Kotlin】函数 ③ ( 匿名函数 | 匿名函数函数类型 | 匿名函数返回 )

    文章目录 一、匿名函数 二、匿名函数函数类型 三、匿名函数返回 一、匿名函数 ---- 声明函数时 , 没有 函数函数 是 匿名函数 ; 匿名函数 可以作为 函数参数 , 也可以作为 函数返回值...Boolean) 扩展函数 , 接收一个 (Char) -> Boolean 类型函数 , 用于 返回匹配给定 匿名函数 字符数 ; /** * 返回匹配给定[谓词 predicate 匿名函数...决定 ; 有 相同 参数顺序 , 参数个数 和 返回类型 函数 , 其 函数类型相同 ; 如上个章节 , 扩展函数 CharSequence.count 接收匿名函数参数 predicate ,...= helloFun() println(str) } 执行结果 : Hello World 三、匿名函数返回 ---- 普通函数 返回值 , 都是 显示返回 , 如 : 使用 return...关键字 , 返回返回值 ; 匿名函数 返回不需要使用 return 关键字 , 匿名函数 可以 隐 返回 函数体最后一行语句 ; 代码示例 : 在匿名函数中 , 第一行是 Int 值 , 第二行是

    3K20

    c++-基类与派生类

    浏览量 1 友元函数必须在类中进行声明而在类外定义,声明时须在函数返回类型前面加上关键字friend。友元函数虽不是类成员函数,但它可以访问类中私有和保护类型数据成员。...覆盖(Override)是指派生类中存在重新定义函数,其函数名、参数列、返回类型必须同父类中相对应被覆盖函数严格一致,覆盖函数和被覆盖函数只有函数体 (花括号中部分)不同,当派生类对象调用子类中该同名函数时会自动调用子类中覆盖版本...隐藏是指派生类函数屏蔽了与其同名基类函数规则如下: 如果派生类函数与基类函数同名,但是参数不同。此时,不论有无virtual关键字,基类函数将被隐藏(注意别与重载混淆)。...void h(float x) { printf("%s", "B::H"); } /*地调用自己类中 "由A类继承过来show()函数" , 这种直接指出某个类某个函数时,...编译器处理方式是这样: 首先在自己类中找有没有A::show(), 如果找到,调用.不在继续在A类中找, 如果找不到,则在指出那个类中(即A类)调用那个函数.

    38820

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——2.类和对象(中(1))

    返回值。 (返回值啥都不需要给,也不需要void,不要纠结,C++规定如此) 3. 对象实例化时系统会⾃动调⽤对应构造函数。 4. 构造函数可以重载。 5....如果类中没有定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参默认构造函数,⼀旦⽤⼾ 定义编译器将不再⽣成。  6....析构函数名是在类名前加上字符 ~。 2. ⽆参数⽆返回值。 (这⾥跟构造类似,也不需要void) 3. ⼀个类只能有⼀个析构函数。若未定义,系统会⾃动⽣成默认析构函数。...Date这样类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成拷⻉构造就可以完 成需要拷⻉,所以不需要我们⽰实现拷⻉构造。...MyQueue这样类型内部主要是⾃定义类型 Stack成员,编译器⾃动⽣成拷⻉构造会调⽤Stack拷⻉构造,也不需要我们⽰实现 MyQueue拷⻉构造。

    6810

    【C++初阶】一文讲通默认成员函数~类和对象(中)

    (返回值啥都不需要给,也不需要void,不要纠结,C++规定如此) class test { public: // 构造函数,与类名相同,没有返回值 test() {} private: };... Date 这样类成员变量全是内置类型且没有指向什么资源,编译器自动生成拷贝构造就可以完成需要拷贝,所以不需要我们显示实现拷贝构造。... MyQueue(两个成员变量都是 Stack 类型) 编译器自动生成拷贝构造会调用 Stack 拷贝构造,也不需要我们实现 MyQueue 拷贝构造。... Date 这样类成员变量全是内置类型且没有指向什么资源,编译器自动生成赋值运算符重载就可以完成需要拷贝,所以不需要我们实现赋值运算符重载。... MyQueue 这样类型内部主要是自定义类型 Stack 成员,编译器自动生成赋值运算符重载会调用 Stack 赋值运算符重载,也不需要我们显示实现。

    10810

    3.类和对象(中)

    默认成员函数 默认成员函数就是用户没有实现,编译器会自动生成成员函数称为默认成员函数(就是我们不写,编译器会默认生成一份)。...无 返回值。 (返回值啥都不需要给,也不需要void,不要纠结,C++规定如此) 3. 对象实例化时系统会自动调用对应构造函数。 4. 构造函数可以重载。可以重载意思是什么呢?...我们可以写多个构造函数,只要参数不同就可以了。 5. 如果类中没有定义构造函数,则C++编译器会自动生成一个无参默认构造函数,一旦用户定义编译器将不再生成。 6....Date这样类成员变量全是内置类型且没有指向什么资源,编译器自动生成拷贝构造就可以完成需要拷贝,所以不需要我们显示实现拷贝构造。...MyQueue这样类型内部主要是自定义类型Stack成员,编译器自动⽣成拷贝构造会调⽤Stack拷贝构造,也不需要我们显示实现 MyQueue拷贝构造。

    7210

    C++类和对象(中)【上篇】(构造,析构,拷贝)

    析构函数名是在类名前加上字符~。 2. ⽆参数⽆返回值。(这⾥跟构造类似,也不需要void) 3. ⼀个类只能有⼀个析构函数。若未定义,系统会⾃动⽣成默认析构函数。 4....Date这样类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成拷⻉构造就可以完成需要拷⻉,所以不需要我们⽰实现拷⻉构造。...MyQueue这样类型内部主要是⾃定义类型Stack成员,编译器⾃动⽣成拷⻉构造会调⽤Stack拷⻉构造,也不需要我们⽰实现MyQueue拷⻉构造。...Date这样类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成拷⻉构造就可以完成需要拷⻉,所以不需要我们⽰实现拷⻉构造。...MyQueue这样类型内部主要是⾃定义类型Stack成员,编译器⾃动⽣成拷⻉构造会调⽤Stack拷⻉构造,也不需要我们⽰实现MyQueue拷⻉构造。

    6310

    详细c++必修:类和对象(二)

    (返回值啥都不需要给,也不需要void,不要纠结,C++规定如此) 对象实例化时系统会⾃动调⽤对应构造函数。 构造函数可以重载。...(这⾥跟构造类似,也不需要void) ⼀个类只能有⼀个析构函数。若未定义,系统会⾃动⽣成>默认析构函数。 对象⽣命周期结束时,系统会⾃动调⽤析构函数。...下面我们来了解几个规则 深拷贝和浅拷贝 若未定义拷⻉构造,编译器会⽣成⾃动⽣成拷⻉构造函数。...Date这样类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成拷⻉构造就可以完 成需要拷⻉,所以不需要我们⽰实现拷⻉构造。...MyQueue这样类型内部主要是⾃定义类型 Stack成员,编译器⾃动⽣成拷⻉构造会调⽤Stack拷⻉构造,也不需要我们⽰实现 MyQueue拷⻉构造。

    12910

    类和对象(中)

    析构函数名是在类名前加上字符~。  2. ⽆参数⽆返回值。(这⾥跟构造类似,也不需要void) 3. ⼀个类只能有⼀个析构函数。若未定义,系统会自动生成默认析构函数。 4....Date这样类成员变量全是内置类型且没有指向什么资源,编译器自动⽣成拷贝构造就可以完成需要拷⻉,所以不需要我们显示实现拷贝构造。...MyQueue这样类型内部主要是自定义类型 Stack成员,编译器自动⽣成拷贝构造会调⽤Stack拷⻉构造,也不需要我们⽰实现 MyQueue拷⻉构造。...Date这样类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成赋值运算符重载就 可以完成需要拷⻉,所以不需要我们⽰实现赋值运算符重载。...MyQueue这样类型内部 主要是⾃定义类型Stack成员,编译器⾃动⽣成赋值运算符重载会调⽤Stack赋值运算符重载, 也不需要我们⽰实现MyQueue赋值运算符重载。

    8110

    【C++】类和对象(中)

    返回值。 (返回值啥都不需要给,也不需要void,不要纠结,C++规定如此) 3. 对象实例化时系统会⾃动调⽤对应构造函数。 4. 构造函数可以重载。 5....Date这样类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成拷⻉构造就可以完成需要拷⻉,所以不需要我们⽰实现拷⻉构造。...MyQueue这样类型内部主要是⾃定义类型Stack成员,编译器⾃动⽣成拷⻉构造会调⽤Stack拷⻉构造,也不需要我们⽰实现MyQueue拷⻉构造。...Date这样类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成赋值运算符重载就可以完成需要拷⻉,所以不需要我们⽰实现赋值运算符重载。...MyQueue这样类型内部主要是⾃定义类型Stack成员,编译器⾃动⽣成赋值运算符重载会调⽤Stack赋值运算符重载, 也不需要我们⽰实现MyQueue赋值运算符重载。

    6910

    C++奇迹之旅:构造函数和析构函数

    默认成员函数:用户没有实现,编译器会生成成员函数称为默认成员函数。...两者结合,构成重载关系: 如果类中没有定义构造函数,则C++编译器会自动生成一个无参默认构造函数,一旦用户定义编译器将不再生成。...总结:如果在Time这个类中如果没有Time()成员函数初始化赋值,那继续类Date这样自定义一个类型,那他会继续调用下一个自定义类默认构造函数,如果后面的类还有,那么他就会不断查找下去,直到最后内置类型有初始化了...如果在Time这个类中如果没有Time()成员函数初始化赋值,那继续类Date这样自定义一个类型,那他会继续调用下一个自定义类默认构造函数,如果后面的类还有,那么他就会不断查找下去,直到最后内置类型有初始化了...特性 析构函数是特殊成员函数,其特征如下: 析构函数名是在类名前加上字符 ~。 无参数无返回类型。 一个类只能有一个析构函数。若未定义,系统会自动生成默认析构函数

    9910

    类和对象(中)(部分)

    (返回值啥都不需要给,也不需要void,不要纠结,C++规定如此) 3. 对象实例化时系统会⾃动调⽤对应构造函数。 4. 构造函数可以重载。 5....(这⾥跟构造类似,也不需要void) 3. ⼀个类只能有⼀个析构函数。若未定义,系统会⾃动⽣成默认析构函数。 4. 对象⽣命周期结束时,系统会⾃动调⽤析构函数。 5....C++规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造,所以这⾥⾃定义类型传值传参和传值返回都会调⽤拷⻉构造完成。 4. 若未定义拷⻉构造,编译器会⽣成⾃动⽣成拷⻉构造函数。...Date这样类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成拷⻉构造就可以完成需要拷⻉,所以不需要我们⽰实现拷⻉构造。...MyQueue这样类型内部主要是⾃定义类型Stack成员,编译器⾃动⽣成拷⻉构造会调⽤Stack拷⻉构造,也不需要我们⽰实现 MyQueue拷⻉构造。

    6310

    Python 为什么没有 void 关键字?

    为了避免混乱,当不需要返回值时,就使用void f() 来作限定。 同时,更主要是,它还起到了占位符作用,表明一个函数类型是已知,这对代码可读性和编译都有所帮助。...这个时候,如果函数本身没有地 return 出一个对象的话,就有两种可能解决办法: 方法一,即声明该函数void 类型 C 和其它语言所做那样,只要能通过类型检查即可 方法二,则是 Python...这样好处至少有两点:一是没有引入新 void 类型和关键字;二是不需要程序员在函数前声明返回类型,这就跟有返回写法保持了一致。...试想一下,如果 Python 不让函数默认有返回值的话,就可能要写成 void def func():... 这样形式,那它就变成了函数定义时一种特例。...Python 为什么要保留 self ?

    88730

    类和对象(中 )C++

    析构函数名是在类名前加上字符 ~ 。 2 . ⽆参数⽆返回值。 (这⾥跟构造类似,也不需要void) 3 . ⼀个类 只能有⼀个析构函数 。...Date这样类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成拷⻉构造就可以完成需要拷⻉,所以不需要我们⽰实现拷⻉构造。...MyQueue这样类型内部主要是⾃定义类型Stack成员,编译器⾃动⽣成拷⻉构造会调⽤Stack拷⻉构造,也不需要我们⽰实现 MyQueue拷⻉构造。...Date这样类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成赋值运算符重载就可以完成需要拷⻉,所以不需要我们⽰实现赋值运算符重载。...MyQueue这样类型内部主要是⾃定义类型Stack成员,编译器⾃动⽣成赋值运算符重载会调⽤Stack赋值运算符重载,也不需要我们⽰实现MyQueue赋值运算符重载。

    8510

    Python 为什么没有 void 关键字?

    void 用在函数参数位置时,它表示该函数不需要传参。 最初 C 语言f() 表示参数数量不确定,为了另外表达“不需要参数”语义,所以引入f(void) 作为限定。...为了避免混乱,当不需要返回值时,就使用void f() 来作限定。 同时,更主要是,它还起到了占位符作用,表明一个函数类型是已知,这对代码可读性和编译都有所帮助。...这个时候,如果函数本身没有地 return 出一个对象的话,就有两种可能解决办法: 方法一,即声明该函数void 类型 C 和其它语言所做那样,只要能通过类型检查即可 方法二,则是 Python...这样好处至少有两点:一是没有引入新 void 类型和关键字;二是不需要程序员在函数前声明返回类型,这就跟有返回写法保持了一致。...试想一下,如果 Python 不让函数默认有返回值的话,就可能要写成 void def func():... 这样形式,那它就变成了函数定义时一种特例。

    81210

    【C++】一文掌握C++四种类型转换 --- static_cast、reinterpret_cast、const_cast、dynamic_cast

    类型不对应具体值,仅用于一些特殊场合,例如最常见是,当函数返回任何值时使用空类型作为返回类型。...2 类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回类型与接收返回类型不一致时,就需要发生类型转化,C语言中总共有两种形式类型转换:隐类型转换和类型转换...隐类型转化:编译器在编译阶段自动进行,能转就转(有关联才能转),不能转就编译失败。整型之间,浮点数和整型之间 类型转化(强制类型转换):需要用户自己处理,各类指针是可以类型转换!...A(int a1) :_a1(a1) {} private: int _a1; int _a2; }; int main() { A aa1 = 1; return 0; } 这样单参数构造函数类支持隐类型转换...void func(A* pa) { B* pb = (B*)pa; } 对于这样一个函数,基类指针会强制类型转换为子类指针,当pa指针本来就是指向是一个B对象,在转换回去,没有问题。

    17910

    【Java基本功】Java 8 新特性终极指南

    返回类型也是由编译器推测出来。如果lambda函数体只有一行的话,那么没有必要使用return语句。...最终采取方法是:增加函数接口概念。函数接口就是一个具有一个方法普通接口。这样接口,可以被隐转换为lambda表达式。...get(int i,String j); } 函数接口 所谓函数接口就是只有一个抽象方法接口,注意这里说是抽象方法,因为Java8中加入了默认方法特性,但是函数接口是不关心接口中有没有默认方法...//函数接口是只提供一个抽象方法接口,其方法由lambda表达式注入,不需要写实现类, //也不需要写匿名内部类,可以省去很多代码,比如实现runnable接口。...有时候,我们并不需要等待所有的异步任务结束,只需要其中一个完成就可以了,CompletableFuture也提供了这样方法: //假设getStream方法返回一个Stream<CompletableFuture

    75420
    领券