函数返回的结构体作为LValue

bgp2000

在以下代码段中,为什么该行o.margin() = m;编译没有错误?它很容易受到警告,因为它几乎总是错误。实际上,我会认为这是一个错误,因为它在任务的左侧放置了一个R值。

#include <iostream>

struct Margin
{
    Margin(int val=0) : val(val) {};
    int val;
};

struct Option
{
    Margin m;
    int z=0;

    Margin margin()const { return m; }
    int zoomLevel() { return z; }
};


int main()
{
    Option o;
    std::cout << "Margin is: "<< o.margin().val << std::endl;

    Margin m = { 3 };

    // The following line is a no-op, which generates no warning:
    o.margin() = m;

    // The following line is an error
    // GCC 4.9.0: error: lvalue required as left operand of assignment
    // clang 3.8: error: expression is not assignable
    // MSVC 2015: error C2106: '=': left operand must be l-value
     o.zoomLevel() = 2;

    std::cout << "Margin is: "<< o.margin().val << std::endl;

    return 0;
}

输出:

Margin is: 0
Margin is: 0
马辛尼

您可以修改类类型的返回类型(通过在其上调用非const方法):

来自n4140的3.10 / 5

5一个对象的左值是修改该对象所必需的,但在某些情况下,也可以使用类类型的右值来修改其引用。[示例:调用对象的成员函数(9.3)可以修改该对象。—结束示例]

您的代码:

o.margin() = m;

实际上与

o.margin().operator=( Margin(m) );

因此,如果将非const方法更改为:

o.margin().val = m;

那么你会得到一个错误。

另一方面,这里:

o.zoomLevel()= 2;

zoomLevel() 返回非类类型,因此您无法对其进行修改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从函数C ++返回结构体数组

来自分类Dev

结构体函数传递和返回

来自分类Dev

将 int 指针 * 作为参数并返回结构体的函数。将数据存储在 struct struct* 中并打印结果

来自分类Dev

从体流返回结构

来自分类Dev

返回结构作为对象

来自分类Dev

当作为接口传递时解码为结构体{} 返回映射

来自分类Dev

为什么结构体可以作为接口传递给函数?

来自分类Dev

从C函数返回结构

来自分类Dev

从函数返回结构

来自分类Dev

从函数返回结构的指针

来自分类Dev

从函数返回结构

来自分类Dev

从函数返回结构

来自分类Dev

将结构体中的字符串传递给函数并返回

来自分类Dev

只读结构作为返回参数

来自分类Dev

匿名结构作为返回类型

来自分类Dev

结构体数组的malloc作为参数传递

来自分类Dev

Rust如何将结构作为函数参数和返回值处理?

来自分类Dev

如何将结构作为参数传递给Java函数或如何从jni返回到Java

来自分类Dev

如何通过以结构数组作为参数的此函数返回正确的值?

来自分类Dev

如何将结构作为参数传递给Java函数或如何从jni返回到Java

来自分类Dev

返回指向结构体的指针数组的指针

来自分类Dev

使用Swift结构构造函数作为函数

来自分类Dev

从结构体(C / Assembly)调用函数

来自分类Dev

C 结构体中的未声明函数

来自分类Dev

函数返回意外的结构值

来自分类Dev

从函数返回结构元素的malloc

来自分类Dev

VBA从函数返回结构类型

来自分类Dev

函数体作为方法调用的参数

来自分类Dev

从返回结构的函数中返回字段