代码之家  ›  专栏  ›  技术社区  ›  Nami

C++箭头类型产生左值

  •  8
  • Nami  · 技术社区  · 10 年前

    根据C++Primer,C++箭头运算符产生左值。此外 decltype 产生左值的表达式将导致引用类型。那么为什么下面的decltype 不 导致引用类型。

    struct MyStruct {
       string name
    };
    MyStruct s;
    s.name = "aname";
    MyStruct* p = &s;
    decltype (p -> name) str = s.name; //type of str will be string and not &string although p -> name yields an lvalue
    
    2 回复  |  直到 10 年前
        1
  •  9
  •   Rakete1111    10 年前

    从…起 cppreference

    如果参数是未语法化的id表达式或 未赋值的类成员访问,然后decltype生成由该表达式命名的实体的类型。 如果没有这样的实体,或者参数命名了一组重载函数,则程序格式错误。

    您的示例就是这种情况,因此它将返回成员的基础类型,即 std::string .

    如果需要,可以添加括号,以便 decltype 导致引用:

    //'str' is a std::string&
    decltype((p->name)) str = s.name;
    
        2
  •  5
  •   Holt 111111    10 年前

    从…起 decltype (来自 §7.1.6.2/4[dcl.type.simple] ):

    如果参数是未语法化的id表达式或 非租借类成员访问 ,然后decltype生成由该表达式命名的实体的类型。

    p->name 属于上述情况,因此 decltype(p->name) 是的类型 p->名称 哪个是 std::string 不 std::string& .

    另一方面 decltype((p->name)) 是 标准::字符串& 因为 (p->name) 是左值表达式。