嗨,大家好问一下:
这是我重载的运算符:
const double & Waz::operator()(int i,int j) const
{
return ((WazImpl const)(*p))(i,j);
}
我在Waz课程中的位置:WazImpl * p;在WazImpl类中我有一个operator()
警告是: 警告C4172返回本地变量的地址或临时
据我所知,我正在返回一个在其他地方被破坏的临时变量,我该怎么办才能解决它?
谢谢!
答案 0 :(得分:3)
如果您剖析该功能,您可以看到它等同于以下内容:
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
时确实会有一个悬空参考。
一种解决方案是通过 value 返回,它将返回结果的副本。也不要按const value
返回,因为它没有意义。
double Waz::operator()(int i, int j) const;
答案 1 :(得分:1)
你有两种可能性。第一个是简单地返回double
而不是引用const double &
double Waz::operator()(int i,int j) const
{
return ((WazImpl const)(*p))(i,j);
}
第二个是返回对原始值的引用,前提是被调用的运算符也将const引用返回到double
const double & Waz::operator()(int i,int j) const
{
const double &rd = (WazImpl const)(*p))(i,j );
return rd;
}
这是一个演示第二种方法的简单示例
#include <iostream>
struct A
{
int & operator ()(){ return a; }
int a = 10;
};
struct B : A
{
int & operator ()()
{
int &ri = A::operator ()();
return ri;
}
};
int main()
{
B b;
b() = 20;
std::cout << b.a << std::endl;
return 0;
}
答案 2 :(得分:0)
您应该向我们展示WazImpl的实现,但似乎WazImpl::operator() const
会返回double
。
这意味着((WazImpl const)(*p))(i,j)
返回一个临时的(它只存在于Waz :: operator()的范围内)。
当Waz::operator()
返回double &
时,您确实会返回对临时的引用。
您要么返回一个刚刚在WazImpl::operator()
中计算的临时值,那么您应该在double
中返回Waz::operator()
,要么您实际上正在返回对{{}中现有双精度的引用1}}并且您应该修复WazImpl
的签名,以便它返回WazImpl::operator() const
。