C++14新特性大全更加智能的auto

Posted 奇妙之二进制

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++14新特性大全更加智能的auto相关的知识,希望对你有一定的参考价值。

函数返回值类型推导

C++14对函数返回类型推导规则做了优化,先看一段代码:

#include <iostream>

using namespace std;

auto func(int i) 
    return i;


int main() 
    cout << func(4) << endl;
    return 0;

使用C++11编译:

~/test$ g++ test.cc -std=c++11
test.cc:5:16: error: ‘func’ function uses ‘auto’ type specifier without trailing return type
 auto func(int i) 
                ^
test.cc:5:16: note: deduced return type only available with -std=c++14 or -std=gnu++14

上面的代码使用C++11是不能通过编译的,通过编译器输出的信息也可以看见这个特性需要到C++14才被支持。

返回值类型推导也可以用在模板中:

#include <iostream>
using namespace std;

template<typename T> 
auto func(T t)  return t; 

int main() 
    cout << func(4) << endl;
    cout << func(3.4) << endl;
    return 0;

这个功能比较实用。

注意

1)函数内如果有多个return语句,它们必须返回相同的类型,否则编译失败。

auto func(bool flag) 
    if (flag) 
        return 1;
    else 
        return 2.3; // error

// inconsistent deduction for auto return type: ‘int’ and then ‘double’

2)如果return语句返回初始化列表,返回值类型推导也会失败

auto func() 
    return 1, 2, 3; // error returning initializer list

  1. 如果函数是虚函数,不能使用返回值类型推导
struct A 
    // error: virtual function cannot have deduced return type
    virtual auto func()  return 1;  

4) 返回类型推导可以用在前向声明中,但是在使用它们之前,翻译单元中必须能够得到函数定义,哈哈,这个前向声明基本没有意义。

auto f();               // declared, not yet defined
auto f()  return 42;  // defined, return type is int

int main() 
    cout << f() << endl;

5)返回类型推导可以用在递归函数中,但是递归调用必须以至少一个返回语句作为先导,以便编译器推导出返回类型。

auto sum(int i) 
    if (i == 1)
        return i;              // return int
    else
        return sum(i - 1) + i; // ok

lambda参数auto

在C++11中,lambda表达式参数需要使用具体的类型声明:

auto f = [] (int a)  return a; 

在C++14中,对此进行优化,lambda表达式参数可以直接是auto:

auto f = [] (auto a)  return a; ;
cout << f(1) << endl;
cout << f(2.3f) << endl;

以上是关于C++14新特性大全更加智能的auto的主要内容,如果未能解决你的问题,请参考以下文章

JDK 14的新特性:更加好用的NullPointerExceptions

c++11新特性1--------------auto

C++17 新特性精华大全

C11新特性之智能指针

c++11新特性注意点

深入浅出之C++11新特性