有这样的代码:
#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?
答案 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.
}
编译结果:
然而,编译器对于他们如何严格地应用这一微妙规则或者根本不同(或者根本不同),会有所不同(或者曾经不同)。 欢呼&amp;第h。,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".
答案 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
并且不可更改,这就是编译器抱怨的原因。