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

将对象分配给方法调用

c++
  •  3
  • rekli  · 技术社区  · 15 年前

    我有一个班,名字是你们班。我的问题是为什么编译器不为下面的代码生成错误?

    YourClass AMethod(){ return YourClass();}
    AMethod() = YourClass();
    

    [在这种情况下,我认为amethod只返回一个值(我的意思是它没有l值)。]

    编辑: 如果我能做到以上为什么我不能做以下

    int AMethod(){ return a;}
    AMethod() = 5;
    
    4 回复  |  直到 15 年前
        1
  •  3
  •   Khaled Alshaya    15 年前

    Eddi1: 我想我第一次没听懂这个问题。

    标准规定: 3.10左值和右值

    调用一个 不返回引用是 右值。用户定义的运算符是 函数,以及 预期或收益率左值已确定 通过它们的参数和返回类型。

    该标准在本段中没有说明任何内容,只是用户定义的类型和基元类型是相同的。如果函数的返回不是引用,则它不是L值。然而,在同一页上有一篇有趣的评论:

    47)调用 构造函数和函数的 返回引用对象的类类型, 并且该实现可以调用 这些对象上的成员函数,但是 表达式不是左值。

    所以基本上在你的例子中:

    AMethod() = YourClass();
    

    amethod返回一个用户定义的类型,在该类型上函数:

    AMethod().operator=(YourClass());
    

    被处决。不过,它不是L值。事实上,C++中可以有空语句,或者只有R值的语句!:

    5;;; // correct C++ code!
    

    编辑2:

    举个例子:

    if( &(YourClass() + YourClass()) == &YourClass() )
    {
    ....
    }
    

    表达 &(YourClass() + YourClass()) 必须产生一个L值,以便整个表达式变得正确。它在VC上编译得很好,但它给出了一个小小的警告:

    warning C4238: nonstandard extension used : class rvalue used as lvalue
    

    显然,上面的线路是用C++标准错了,但是VC只是允许它!


    因为你是这么要求的。首先,一个新的例子 YourClass 由返回 AMethod . 然后,它被分配另一个新实例。当然,在c++中,你想说什么就说什么。所以,为了防止赋值语句,只需返回 const YourClass . 在这种情况下,对象变成“ 可读的 “只有:

    const YourClass AMethod(){ return YourClass();}
    

    这与重载二进制运算符的情况相同。例如,如果 operator+ 对于一个类,你可以这样做 const 或者没有它。

    // '+' operator is defined as a friend operator not a member.
    friend YourClass operator+(const YourClass& lhs, const YourClass& rhs)
    {
    ...
    }
    

    如果你这样做,你可能会有如下无意义的陈述:

    (a + b) = c;
    

    其中表达式 (a + b) 不是很有用,因为它只代表一个值,而不是我们控制的变量,它生成一个临时变量。

        2
  •  2
  •   sbi    15 年前

    AMethod 返回一个 价值 . 在C++中,可以调用成员函数,甚至修改成员函数。 用户自定义类型 . 有时候这正是你想要的。

    os.get_disk_accessor(0).wipe(); // wipe() might not be a const member function
    

    但是,不能调用rof值的操作。 内置的 类型:

    int f();
    f() = 5; // won't compile
    ++f();   // won't either
    
        3
  •  0
  •   David R Tribble    15 年前

    表达

    AMethod()
    

    创建并返回类对象,以及表达式

    AMethod() = YourClass();
    

    创建第二个类对象并将其分配给第一个对象。

        4
  •  0
  •   Davit Siradeghyan    15 年前

    我认为编译第一个版本是因为你的类有一个默认的构造函数、析构函数、复制构造函数和 赋值运算符 它称为amethod()=yourclass();。 int amethod(){返回a;} 紫外()=5; 此代码无法编译,因为没有rvalue。