簡體   English   中英

虛擬constexpr功能如何可能?

[英]How are virtual constexpr function possible?

從C ++ 2a開始,虛函數現在可以是constexpr。 但據我所知,你仍然無法在constexpr上下文中調用任意函數指針。

動態多態通常使用vtable實現,其中包含要調用的函數指針。

此外,使用virtual動態多態性可用於調用類型的覆蓋函數,這些函數在編譯時不知道它是哪一個。 例如:

struct A {
    virtual void fn() const {
        std::cout << 'A' << std::endl;
    }
};

void a_or_b(A const& a) {
    // The compiler has no idea `B` exists
    // it must be deferred at runtime
    a.fn();
}

struct B : A {
    void fn() const override {
        std::cout << 'A' << std::endl;
    }
};

int main() {
    // We choose which class is sent
    a_or_b(rand() % 2 ? A{} : B{});
}

因此,考慮到那些在編譯時無法調用函數指針的函數,並且當編譯器沒有足夠的信息來靜態推斷調用哪個函數時,會使用虛擬多態,虛擬constexpr函數如何可能?

請記住,只有當編譯器已經知道類型時才會在編譯時調用constexpr虛函數,顯然它們不會通過虛擬調度調用。

相應的提案提供了類似的解釋:

目前在常量表達式中禁止虛函數調用。 由於在常量表達式中,需要知道對象的動態類型(例如,為了診斷轉換中的未定義行為),限制是不必要的和人為的。 我們建議刪除限制。

它也有一個非常好的激勵例子。

暫無
暫無

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

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