更改基本类型和类类型的返回值

时间:2011-10-22 17:08:53

标签: c++

有这样的代码:

#include <iostream>
#include <string>

int returnnumber() { return 2; }
std::string returntext() { return "siema"; }

int main() {

    std::cout << (returntext() += "cze") << std::endl; // siemacze
    //std::cout << (returnnumber() += 2) << std::endl; error: lvalue required as left operand of assignment

    return 0;
} 

为什么可以更改std :: string的返回值,但不能更改int?

4 个答案:

答案 0 :(得分:10)

因为std::string是一个类型,其中定义了+=运算符作为成员函数。

,标准允许您在rvalues上调用成员函数。

这是一个愚蠢的结果

struct S { int x; };
S foo() { return S(); }

int main()
{
    foo() = S();    // OK, uses member assignment operator.
    foo().x = 666;  // !Nah, can't assign to rvalue of built-in type.
}

编译结果:

Comeau C/C++ 4.3.10.1 (Oct  6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing.  All rights reserved.
MODE:strict errors C++ C++0x_extensions

"ComeauTest.c", line 7: error: expression must be a modifiable lvalue
      foo().x = 666;  // !Nah, can't assign to rvalue of built-in type.
      ^

1 error detected in the compilation of "ComeauTest.c".
然而,编译器对于他们如何严格地应用这一微妙规则或者根本不同(或者根本不同),会有所不同(或者曾经不同)。

欢呼&amp;第h。,

答案 1 :(得分:2)

内置类型的赋值运算符的左侧必须是可修改的左值,但如果函数的函数返回值始终为 rvalue 不返回引用类型。

operator+=std::string的成员函数,您可以在类类型的 rvalue 上调用成员函数。

答案 2 :(得分:1)

出于同样的原因

std::string("siema") += "cze";

作品。

您正在构建一个新对象并将operator +=std::string拥有)应用于该对象。

尝试使用它不会起作用,因为你的函数返回rvalue。这就像是:

2 += 2

你可以玩这个:

#include <iostream>
#include <string>

int& returnnumber() { int * k = new int; *k = 2; return *k; }
std::string returntext() { return "siema"; }

int main() {

    std::cout << (returntext() += "cze") << std::endl; // siemacze
    std::cout << (returnnumber() += 2) << std::endl; //no error
    std::string("siema") += "cze";
    return 0;
} 

但这会导致内存泄漏,所以不要这样做。它只是一个概念证明,即返回lvalue会起作用。

答案 3 :(得分:0)

returntext()会返回std::string,可以在以后的阶段修改+=operator。但是,虽然returnnumber()返回int,但函数本身返回2,这是默认的const int并且不可更改,这就是编译器抱怨的原因。