亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以像 Java 的“空白最終”功能那樣,在C++中推遲 const 變量的初始化?

是否可以像 Java 的“空白最終”功能那樣,在C++中推遲 const 變量的初始化?

拉風的咖菲貓 2022-09-14 15:56:15
在Java中,我們可以聲明一個空白的最終變量,并在以后對其進行初始化。編譯器將確保初始化只發生一次 - 初始化失敗或雙重初始化都是編譯時錯誤。例如:public int bar() {   return 66;}public void foo() {    final int x; // declare the variable    ...    x = bar(); // initialization only once}在Java中,編譯器可以保證在第一次賦值之前絕對不會在任何代碼路徑上賦值,并且可以保證它絕對不會在任何代碼路徑上被分配第二次。(有關更多信息,請參見 Java 語言規范的第 16 章 “確定賦值”。x我們如何在C++中實現類似的行為?是否可以聲明變量但推遲其初始化?(不丟棄說明符。constconst
查看完整描述

2 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

除非定義了 const,否則無法對其進行初始化。你必須找到一種方法來知道它的定義價值。如果 很難確定 的值,請考慮使用函數的結果,例如x

const int x = calc_x();

或類似的閉包

const int x = []() { /* code to calculate x's value */ }();

constness 是對象類型的一部分,并且對象類型在任何情況下都不能更改,因此要么是,您以后無法初始化它,要么根本不是。xconstxconst

可以設計一個可以模擬此內容的包裝器,但您最多只能得到一個運行時錯誤。class

請注意,似乎可能存在以下形式的解決方案,但假設所討論的對象實際上不是 。在初始化后無法合法更改其值的情況下。const_castconstconst int x


查看完整回答
反對 回復 2022-09-14
?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

C++沒有內置功能。不過,您可以自己構建它。您可以創建一個類來保存所需類型的對象的存儲空間,并且可以重載該對象的賦值運算符,以便只能調用和初始化一次。這看起來像


template<typename T>

class once

{

private: 

    std::aligned_storage_t<sizeof(T), alignof(T)> data;

    T* ptr = nullptr;

public:

    once() = default;

    ~once()

    {

        if(ptr) // it is initialized so call the destructor

            ptr->~T();

        // optionally you can add

        // throw("a once<T> must be initialized once");

        // this can help to enforce that the object is actually initialized as you'll get a runtime exception in code that does not do so

    }

    template<typename U>

    once& operator =(U&& value)

    {

        if (!ptr) // it is not initialized so call constructor

        {

            ptr = new(&data) T(std::forward<U>(value));

        }

        else

            throw ("can only assign to a once<T> once.");

        return *this;

    }

    operator const T&()

    {

        return *ptr;

    }


};

然后你會像這樣使用它


int main()

{

    once<int> foo;

    if (1 < -1)

        foo = 21;

    else

        foo = 42;

    std::cout << foo;

    //foo = 23; // uncomment this to get an exception.

}


查看完整回答
反對 回復 2022-09-14
  • 2 回答
  • 0 關注
  • 91 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號