const double& Waz::operator()(int i, int j) const {
// Cast pointer to callable.
const WazImpl& wi = static_cast<const WazImpl>(*p);
// Get result of calling callable.
double d = wi(i, j);
// Return REFERENCE to local object.
return d;
} // All local objects is destroyed and references to them become dangling.
所以,在调用 Waz::operator 时,你确实得到了悬空参考 .
一种解决方案是按值返回,该值将返回结果的副本 . 也不要通过 const value 返回,因为它没有多大意义 .
3 回答
如果您剖析该函数,您可以看到它等效于以下内容:
所以,在调用
Waz::operator
时,你确实得到了悬空参考 .一种解决方案是按值返回,该值将返回结果的副本 . 也不要通过
const value
返回,因为它没有多大意义 .你有两种可能性 . 第一个是简单地返回
double
而不是引用const double &
第二个是返回对原始值的引用,前提是被调用的运算符也将const引用返回到double
这是一个演示第二种方法的简单示例
您应该向我们展示WazImpl的实现,但似乎
WazImpl::operator() const
返回double
.这意味着
((WazImpl const)(*p))(i,j)
返回一个临时的(它只存在于Waz :: operator()的范围内) .当
Waz::operator()
返回double &
时,您确实返回对临时的引用 .您要么返回一个刚刚在
WazImpl::operator()
中计算的临时值,那么您应该在Waz::operator()
中返回double
,或者您实际上是在WazImpl
中返回对现有双精度的引用,并且您应该修复WazImpl::operator() const
的签名以使其返回const double&
.