这个代码行为定义得好吗? 这里有一些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)); } #包括 甲级 { int x; int-y; 双v; 公众: A(整数x,整数y) :x(x),y(y) { std::cerr

这个代码行为定义得好吗? 这里有一些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)); } #包括 甲级 { int x; int-y; 双v; 公众: A(整数x,整数y) :x(x),y(y) { std::cerr,c++,C++,您正在声明一个A对象作为f的实际参数,当您这样做时,对于所有影响,新对象就像f的局部变量,因此保证在f执行结束时调用A 如果f返回由运算符double*()返回的地址,在F返回后,您将访问无效内存。避免这种情况的一种方法是使双V static,但必须考虑到,在代码中,A类创建的对象只在F块运行时退出。 在函数调用之前,对函数的参数进行评估。d临时变量将活到它们所在的完整表达式的末尾。因此,是的,A的实例将活到调用f的末尾

您正在声明一个A对象作为f的实际参数,当您这样做时,对于所有影响,新对象就像f的局部变量,因此保证在f执行结束时调用A


如果f返回由
运算符double*()返回的地址,在F返回后,您将访问无效内存。避免这种情况的一种方法是使<代码>双V static,但必须考虑到,在代码中,A类创建的对象只在F块运行时退出。

在函数调用之前,对函数的参数进行评估。d临时变量将活到它们所在的完整表达式的末尾。因此,是的,

A
的实例将活到调用
f
的末尾