簡體   English   中英

靜態(可能是constexpr)數據成員lambda

[英]Static (possibly constexpr) data member lambda

以下代碼無法編譯:

struct object 
{
    static constexpr auto f;
};

constexpr auto object::f = [](auto&& x){x += 1;};

這兩個都不是:

struct object 
{
    static constexpr auto f = [](auto&& x){x += 1;};
};

但這確實是(當f不是成員時):

static constexpr auto f = [](auto&& x){x += 1;};

有沒有一種方法可以在C ++ 14中聲明和定義靜態constexpr數據成員lambda?

靜態數據成員的規則位於[class.static.data]中:

如果非易失性const static數據成員是整數或枚舉類型,則其在類定義中的聲明可以指定大括號或相等初始化器 ,其中每個作為賦值表達式的 初始化子句都是一個常量表達式(5.19 )。 可以使用constexpr說明符在類定義中聲明文字類型的static數據成員; 如果是這樣,則其聲明應指定一個花括號或相等的初始化程序 ,其中每個作為賦值表達式的 初始化程序子句都是一個常量表達式。

在類定義中只能定義static const整數/枚舉類型或constexpr成員。 C ++ 14不允許使用constexpr lambdas期。 [expr.const]中的措詞用於讀取:

條件表達式e是核心常數表達式,除非按照抽象機(1.9)的規則對e的求值將對以下表達式之一求值:
— [...]
lambda表達式 (5.1.2);
— [...]

因此,在C ++ 14中,您只能有一個靜態的lambda數據成員-您不能內聯定義它,也不能超出定義范圍,因為您無法聲明它(用auto require聲明的變量初始化程序)。 你真倒霉


在C ++ 17中,我們可以有constexpr感謝lambda表達式P0170 ,此時你的第二個選擇是罰款:

struct object 
{
    static constexpr auto f = [](auto&& x){x += 1;};
};

暫無
暫無

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

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