【发布时间】:2019-04-21 09:07:43
【问题描述】:
我在 C++ 中实现了一个简单的函数,它比较两个对象并返回它们的最大对象的引用增加了 1。我希望创建一个临时对象,当返回该对象的引用时,会发出警告由于临时对象的悬空引用,编译器将出现。但不会产生警告。我几乎不明白为什么会这样。
下面是我写的代码
#include <iostream>
#include <string>
class A
{
public:
A():v(0)
{
std::cout << "A::ctror" <<std::endl;
}
A (int const & x):v(v + x)
{
std::cout << "convertion::ctror(int)" << std::endl;
}
static A & max(A & x , A & y)
{
return x.v > y.v ? (x+1) : (y +1 ) ;
}
A & operator +( A const a )
{
this->v+=a.v;
return *this;
}
int v ;
};
int main()
{
A a1;
A a2;
a1.v = 1;
a2.v = 6;
A const & a3 = A::max(a1,a2);
std::cout << a3.v << std::endl;
}
【问题讨论】:
-
这里没有悬空引用
-
@Kerndog73 为什么没有悬空引用? x+1 创建了一个引用返回的新对象A?是这样吗?
-
operator+返回一个引用。a3是对a2的引用。没有悬空参考 -
x+1不会创建新对象。您的operator+行为类似于+=;它增加左操作数并返回对它的引用。 -
你的
A (int const & x):v(v + x)构造函数坏了:它从v读取,这是一个未初始化的变量。
标签: c++ reference compiler-warnings ternary-operator