ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 对抽象类和`decltype`的L值引用

2019-07-25 06:06:23  阅读:181  来源: 互联网

标签:c c11 abstract-class decltype


我提出了下面这段代码,认为它不会起作用,但令我惊讶的是它完全没问题,我想要一些解释.

#include <cstdio>
#include <algorithm>

struct Abstract
{
    Abstract()
        { printf("\tConstructing Abstract instance.\n"); }

    virtual const char* name() const =0;
    auto talk() const -> decltype(*this)
    {
        printf("My name is %s.\n",name());
        return *this;
    }
};

struct Concrete
    : public Abstract
{
    Concrete() 
        { printf("\tConstructing Concrete instance.\n"); }
    const char* name() const
        { return "Bond"; }
};

int main()
{
    Concrete C;
    printf("James %s.\n",C.talk().name());
}

此代码的输出是:

    Constructing Abstract instance.
    Constructing Concrete instance.
My name is Bond.
James Bond.

Q1(这是对C 11的非特异性,只需删除decltype并用const Abstract&替换auto).为什么编译器接受语法C.talk().name()?

除非我弄错了,我认为表达式C.talk()可以是prvalue(Abstract的副本,不是因为只有一个构造函数输出的情况)或左值引用,在这种情况下我不确定是什么因为对我来说,对抽象类的左值引用似乎也不可能.

Q2这引出了第二个问题:decltype如何“知道”返回某种引用,而不是一个简单的值?

解决方法:

Q1:不仅允许对抽象类进行左值引用,而且实际上多态性必不可少.请注意,引用类型对应于表达式的静态类型,而不是对象的动态类型,当然它不能是抽象类(实际上,这也不完全正确,但它足够接近于此目的)回答).

因此,语法C.talk().name()被接受,因为Abstract类型包含成员函数name()的声明,并且它将被正确执行,因为在执行时,实际调用的函数取决于动态类型,这是具体的,并具有name()的实现.

Q2:*这是左值表达式,左值表达式的decltype给出左值引用.

标签:c,c11,abstract-class,decltype
来源: https://codeday.me/bug/20190725/1530112.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有