RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 563318
Accepted
sxwqz
sxwqz
Asked:2020-09-06 16:21:54 +0000 UTC2020-09-06 16:21:54 +0000 UTC 2020-09-06 16:21:54 +0000 UTC

decltype(auto) 构造

  • 772

decltype(auto)如果我们可以写,为什么从函数返回时需要构造auto?

c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Abyx
    2020-09-06T16:41:37Z2020-09-06T16:41:37Z

    auto它是一种“腐烂”的表达类型,即 链接丢失并发生复制:

    string& f();
    
    auto x = f();  // тип x - string, ссылка потерялась, строка скопировалась
    
    auto g() { return f(); }  // возвращается string
    // аналог в С++11: auto g() -> decay<decltype(f())>::type;
    

    decltype(expr)是表达式的实际类型,没有收缩。
    decltype(auto)是一种方便的语法,允许您不在其中编写表达式decltype。

    decltype(auto) y = f();  // тип y - string&
    // аналог в С++11: decltype(f()) y = f();
    
    decltype(auto) h() { return f(); }  // возвращается string&
    // аналог в С++11: auto h() -> decltype(f());
    

    换句话说, 这decltype(auto)是一个方便的替换decltype(expr),这是一个简短的语法。
    autostd::decay<decltype(auto)>::type

    • 26
  2. Sergey Tyulenev
    2020-09-06T16:46:23Z2020-09-06T16:46:23Z

    汽车

    在 C++11 中,auto 关键字已被剥离其作为存储类说明符的原始含义,现在用于在给出显式初始化程序时实现自动类型推断。编译器将变量的类型设置为初始化值的类型:

    auto maton = 112;       // maton получает тип int 
    auto pt    = &maton;    // pt получает тип int * 
    double fm(double, int); 
    auto pf    = fm;        // pf получает тип double (*) (double, int) 
    

    auto 关键字还可以简化模板声明。例如,如果 il 是 类型的对象std::initializer_list<double>,则以下代码

    for (std::initializer_list<double>::iterator p = il.begin(); 
                p !=il.end(); p++) 
    

    可以用这个代替:

    for (auto p = il.begin(); p != il.end(); p++) 
    

    解密类型

    decltype 关键字创建表达式指定类型的变量。下面的语句表示“将 y 分配给与 x 相同的类型”,其中 x 是一个表达式:

    decltype(х) у; 
    

    这里还有几个例子:

    double x; 
    int n; 
    decltype(x*n) q;  // q получает тот же тип, что и х*n, т.е. double 
    decltype(&x) pd;  // pd получает тот же тип, что и &х, т.е. double * 
    

    这在模板定义中特别有用,在模板定义中,在创建特定实例之前可能无法定义类型:

    template<typename Т, typename U) 
    void ef (T t, U u) 
    { 
        decltype(T*U) tu; 
        ...
    } 
    

    尾返回类型

    C++11 有一个用于声明函数的新语法,其中返回类型在函数名称和参数列表之后而不是在它们之前指定:

    double f1(double, int);         // традиционный синтаксис 
    auto f2(double, int) -> double; // новый синтаксис, // возвращаемым типом является double 
    

    新语法可能看起来不如传统的函数声明可读,但它使得使用decltype模板函数指定返回类型成为可能:

    template<typename Т, typename U) 
    auto eff (T t, U u) -> decltype (T*U) 
    { 
    } 
    

    这里说明的问题是,当编译器读取eff的参数列表时,T和U不在范围内,所以任何使用decltype都必须在这个参数列表之后。新语法使这成为可能。

    • 4

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5