这段代码的行为是否被明确定义?

4

这里是一些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()

也就是说,我希望它这样工作。但我不确定在 f 返回后是否必须调用 A 的析构函数。这有保证吗?operator double* ()返回的指针是否可能在调用 f 时变为无效?
2个回答

4
你正在将一个A对象声明为f的实际参数,在这样做时,新对象就像f的本地变量一样,因此~A保证在f执行结束时被调用。
如果f返回operator double*()返回的地址,并且在f返回后使用它,那么你将访问无效的内存。避免这种情况的一种方法是将double v定义为静态的,但你必须考虑到,在你的代码中,创建的A类对象只存在于f块运行期间。

3
在函数被调用之前,函数的参数会被先进行求值,并且临时变量将会存在于它们所在的完整表达式结束之前。因此,是的,A实例会生存到f调用结束的时候。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接