这个代码行为是否定义明确?

时间:2014-01-14 11:34:36

标签: c++

这是一些C ++代码:

#include <iostream>

class A
{
    int x;
    int y;
    double v;

    public:
        A(int x, int y)
            :x(x),y(y)
        {
            std::cerr << "A("<<x<<","<<y<<")\n";
        }
        ~A()
        {
            std::cerr << "~A()\n";
        }
        operator double* ()
        {
            v=1.5*x+y;
            return &v;
        }
};

void f(double* val)
{
    std::cerr << "f("<<*val<<")\n";
    *val=0.3;
}

int main()
{
    f(A(3,5));
}

我得到以下输出:

  

A(3,5)
  F(9.5)
  〜A()

即。因为我喜欢它的工作。但我不确定在 A返回后是否必须将f的析构函数称为。有保证吗?在operator double* ()的调用中,f返回的指针是否会以某种方式变为无效?

2 个答案:

答案 0 :(得分:4)

您正在声明一个A对象作为f的实际参数,当您这样做时,对于所有效果,新对象就像f的局部变量所以〜保证在执行结束时调用A. / p>

如果f返回operator double* ()返回的地址,并且在f返回后使用它,则将访问无效内存。避免这种情况的一种方法是使double v静态但你必须考虑到,在你的代码中,A类创建的对象只在f块运行时退出。

答案 1 :(得分:3)

函数的参数在调用函数之前被计算,临时函数将存活到它们所在的完整表达式的末尾。所以是的,A的实例将活到f的调用结束。