这个问题的答案指出,你不应该返回参数的引用,因为它们可能是临时变量,可能会超出范围,并且如果结果被分配给引用,则不会被保存。
按照这个逻辑,下面的代码是否有类似的问题?
似乎结果表明,除非你愿意在基于范围的for循环中冒着出现未定义行为的风险,否则不应该返回函数参数的引用。
按照这个逻辑,下面的代码是否有类似的问题?
#include <iostream>
class T
{
public:
T& operator+=(const T& t) { this->x += t.x; return *this; }
T(int x) : x(x) {}
int x;
~T()
{
std::cout << "My value is " << this->x << " and I'm dead." << std::endl;
this->x = -999;
}
};
int main()
{
const T& t = (T(2) += T(3));
std::cout << t.x << std::endl;
}
如果是这样,我该如何编写 +=
运算符以避免此问题?
我还想象中在C++11中以下代码也会有问题,但我还没有检查过:
#include <iostream>
#include <string>
int main()
{
for ( char x : std::string("hello") += std::string("world") )
{
std::cout << x << std::endl;
}
}
似乎结果表明,除非你愿意在基于范围的for循环中冒着出现未定义行为的风险,否则不应该返回函数参数的引用。
auto&&
将绑定一个左值引用,因为这是operator+=
返回的内容。这不会延长临时对象的生命周期,代码确实是未定义行为。 - R. Martinho Fernandes