Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 持有函数返回对象值的引用/指针合法吗?_C++ - Fatal编程技术网

C++ 持有函数返回对象值的引用/指针合法吗?

C++ 持有函数返回对象值的引用/指针合法吗?,c++,C++,按值传递函数的返回对象合法吗? 我有一个来自a::getA()的函数,它按值返回一个对象。 在同一行中引用此值是否合法,请参见第行 b.processA(a.getA()) 请参阅下面我的代码: class A { public: int a; std::list<int*> m_list; A(int a) { this->a =a; } A(A& _a) { this->

按值传递函数的返回对象合法吗? 我有一个来自
a::getA()
的函数,它按值返回一个对象。 在同一行中引用此值是否合法,请参见第行
b.processA(a.getA())

请参阅下面我的代码:

class A
{
public:
    int a;
    std::list<int*> m_list;

    A(int a)
    {
        this->a =a;
    }

    A(A& _a)
    {
        this->a =_a.a;
        m_list.push_back(&a);
    }

    A getA()
    {
        A localA(20);
        localA.m_list.push_back(&localA.a);
        return localA;
    }
};

class B
{
public:
    char b;

    B(char b)
    {
    }

    void processA(A& a)
    {
            a.a = 1;
            processA2(a);
    }

    void processA2(A& a)
    {
        a.a = 2;
    }
};

void main()
{
    B b('a');
    A a(11111);
    //************
    // IS THE FOLLOWING LINE LEGAL??
    // I mean, is it legal to pass the return object of the function by value
    //************
    b.processA(a.getA());
}
A类
{
公众:
INTA;
std::列表m_列表;
A(INTA)
{
这->a=a;
}
A(A&_A)
{
这->a=\u a.a;
m_列表。推回(&a);
}
A getA()
{
A localA(20);
localA.m_list.push_back(&localA.a);
返回localA;
}
};
B类
{
公众:
字符b;
B(字符B)
{
}
无效流程A(A&A)
{
a、 a=1;
程序A2(a);
}
无效流程A2(A&A)
{
a、 a=2;
}
};
void main()
{
B(“a”);
A(11111);
//************
//下面这句话合法吗??
//我的意思是,通过值传递函数的返回对象合法吗
//************
b、 processA(a.getA());
}
不,它甚至不会编译。原因是
a.getA()
返回一个临时对象,该对象不能绑定到非常量引用类型

但是,如果将参数const reference设置为:

void processA(A const & a) 
那就好了

注意:MSVC++将临时对象绑定到非常量引用作为扩展。这不是标准

不,它甚至不会编译。原因是
a.getA()
返回一个临时对象,该对象不能绑定到非常量引用类型

但是,如果将参数const reference设置为:

void processA(A const & a) 
那就好了


注意:MSVC++将临时对象绑定到非常量引用作为扩展。它不是标准的。

所以基本上你是在问:

X f();
void g(X& x);

g(f());
是否合法

作为安全预防措施,非成本引用不能绑定到临时引用。因此,上述规定是不合法的

但是,以下内容是合法的:

X f();
void g(const X& x);

g(f());
临时部队将一直生存到g回来


第一个版本是llegal的原因是因为g所做的任何更改都将被丢弃,所以为什么要这样做呢?它很可能表示一个逻辑错误,因此作为一个语言设计决策,它是一个编译时错误。

所以基本上你是在问:

X f();
void g(X& x);

g(f());
是否合法

作为安全预防措施,非成本引用不能绑定到临时引用。因此,上述规定是不合法的

但是,以下内容是合法的:

X f();
void g(const X& x);

g(f());
临时部队将一直生存到g回来


第一个版本是llegal的原因是因为g所做的任何更改都将被丢弃,所以为什么要这样做呢?它很可能表示逻辑错误,因此作为语言设计决策,它是编译时错误。

关于为什么
void main
的链接不好:使用
void main()
是不合法的;您必须使用
int main()
int main(int-argc,char**argv)
。根据哪个州的法律,这是非法的?:-)关于为什么
void main
不好的链接:使用
void main()
是不合法的;您必须使用
int main()
int main(int-argc,char**argv)
。根据哪个州的法律,这是非法的?:-)但是请注意,代码有更多的问题(
getA
间接创建指向过时对象的指针)@bochaltura MSVS有一个扩展,允许您绑定到非常量引用。如果你关闭语言扩展,你会得到一个错误。@ BoChutura:这是一个MSVC扩展到C++语言。@ BoCurTura:在我的答案中读注释。我猜想,重复。但是,代码有更多的问题(<代码> GETA <代码>间接地创建一个指向过时对象的指针)。@bochaltura MSVS有一个扩展,允许您绑定到非常量引用。如果你关闭语言扩展,你会得到一个错误。@ BoChutura:这是一个MSVC的扩展到C++语言。@博查图拉:读我的答案中的注释。