[英]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.