簡體   English   中英

C ++ const左值引用

[英]C++ const lvalue references

假設我有:

  • A類不可復制
  • 作為成員的類B,const A&a(並在其構造函數中獲取A並將其設置在其初始化列表中)
  • 函數A GenerateA();

這是否意味着它應該有效:B(GenerateA())?

即,const ref是否意味着沒有生成A()返回的A副本完成? 這是否意味着只要B存在,返回的臨時范圍就會延長?

編輯:注釋中的插件問題:如果左值是一個常數A&?是否可以將A&從GenerateA()返回到本地A.

謝謝!

如果A是不可復制的,則函數A GenerateA()無效,因為按值返回需要創建副本。

如果函數返回引用(即A &GenerateA() )並且引用是本地創建的A對象,則函數退出后它將變為無效。 C ++沒有任何形式的垃圾收集,因此只要它在使用中就無法“延長”對象的生命周期。

正如其他人已經說過的那樣,如果A不可復制,則A GenerateA()無法編譯。

關於const ref:no,臨時的生命周期不會延長到B的生命周期。標准[12.2.5]規定:

綁定到構造函數的ctor-initializer(12.6.2)中的引用成員的臨時綁定將持續存在,直到構造函數退出。 [...]函數返回語句(6.6.3)中返回值的臨時綁定將持續存在,直到函數退出。

所以,是的,臨時的生命周期的擴展存在於某些情境中(並且有時非常有用: 請參閱本文 ),但不是在您提供的那個中。

關於你的上一個問題,從GenerateA()返回對局部變量的引用是不合法的(並且將結果綁定到const引用將沒有任何幫助)。

是和否。

是的,const引用將綁定到臨時變量。 不,作為類成員的const引用不會像const引用自動持續時間那樣延長生命周期。

這是一個例子

#include <iostream>
using namespace std;

int& GenX(bool reset)
{
    static int* x = new int;
    *x = 100;
    if (reset)
    {
        delete x;
        x = new int;
        *x = 200;
    }
    return *x;
}

class YStore
{
public:
    YStore(int& x);
    int& getX() { return my_x; }
private:
    int& my_x;
};

YStore::YStore(int& x)
 : my_x(x)
{
}

int main()
{
    YStore Y(GenX(false));
    cout << "X: " << Y.getX() << endl;
    GenX(true); // side-effect in Y
    cout << "X: " << Y.getX() << endl;
    return 0;
}

輸出:

X: 100
X: 200

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM