第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

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

2 回答

?
白板的微信

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊

除非定義了 const,否則無法對(duì)其進(jìn)行初始化。你必須找到一種方法來知道它的定義價(jià)值。如果 很難確定 的值,請(qǐng)考慮使用函數(shù)的結(jié)果,例如x

const int x = calc_x();

或類似的閉包

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

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

可以設(shè)計(jì)一個(gè)可以模擬此內(nèi)容的包裝器,但您最多只能得到一個(gè)運(yùn)行時(shí)錯(cuò)誤。class

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


查看完整回答
反對(duì) 回復(fù) 2022-09-14
?
慕斯王

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊

C++沒有內(nèi)置功能。不過,您可以自己構(gòu)建它。您可以創(chuàng)建一個(gè)類來保存所需類型的對(duì)象的存儲(chǔ)空間,并且可以重載該對(duì)象的賦值運(yùn)算符,以便只能調(diào)用和初始化一次。這看起來像


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;

    }


};

然后你會(huì)像這樣使用它


int main()

{

    once<int> foo;

    if (1 < -1)

        foo = 21;

    else

        foo = 42;

    std::cout << foo;

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

}


查看完整回答
反對(duì) 回復(fù) 2022-09-14
  • 2 回答
  • 0 關(guān)注
  • 89 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)