簡體   English   中英

如果 constexpr(condition) 作為編譯時條件

[英]if constexpr(condition) as compile-time conditional

我想使用 constexpr bool(下面示例中的useF )來啟用以下代碼中的功能。 在這里,調用A::f() 此外,我想在我關閉該功能的情況下成為void的別名模板( a )。

我嘗試使用 constexpr if 語句,但主體仍在被實例化,這會導致編譯錯誤。 如果我使用包裝器模板 ( X ),則正文將按我的預期被丟棄,但這對我來說似乎很難看。 有沒有其他方法可以做到這一點?

constexpr bool useF = false;

struct A {
    static void f() {}
};

using a = std::conditional<useF, A, void>::type;

template<typename L>
struct X {
    static void h() {
        if constexpr(std::is_same<L, A>::value) {
            L::f(); // not instantiated, no error
        }
    }
};

int main() {
    if constexpr(useF) {
        a::f(); // error!?
    }

    X<a>::h();
}

我使用 g++-7.0.1 和 -std=c++17

if constexpr僅用於模板。 來自 [stmt.if]:

如果if語句的形式為if constexpr ,則條件的值應為bool (5.20) 類型的上下文轉換常量表達式; 這種形式稱為constexpr if語句。 如果轉換條件的值為false ,則第一個子語句丟棄的語句,否則第二個子語句(如果存在)是丟棄的語句。 在封閉模板化實體的實例化期間(第 14 條) ,如果條件在實例化后不依賴於值,則不會實例化丟棄的子語句(如果有)。

X , constexpr if 語句將阻止其他格式錯誤的語句被實例化。 這就是此語言功能的目標。 但是在模板之外,沒有這樣的等效增益。

暫無
暫無

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

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