[英]In C++14 can a constexpr member change a data member?
在C ++ 14中,由於constexpr
不再是隱式const
,因此constexpr
成員函數可以修改類的數據成員:
struct myclass
{
int member;
constexpr myclass(int input): member(input) {}
constexpr void f() {member = 42;} // Is it allowed?
};
據我所知,是的。 限制來自[dcl.constexpr]:
constexpr
函數的定義應滿足以下約束:
- 它不應是虛擬的(10.3);
- 其返回類型應為字面類型;
- 每個參數類型都應為文字類型;
- 它的函數體應為= delete
,= default
或不包含的復合語句
- asm-definition ,
- 一個
goto
聲明,- 嘗試塊 ,或
- 非文字類型或靜態或線程存儲持續時間的變量的定義,或者不執行初始化的定義。
該功能滿足所有這些要求。
是的,我相信這個改變始於提議N3598:constexpr成員函數和隱式const並最終成為N3652的一部分:放寬對constexpr函數的約束,這改變了第7.1.5
節第3
段功能體中允許的白色 -列表:
它的函數體應為= delete,= default或僅包含的復合語句
- 空語句,
- static_assert申述
- typedef聲明和不定義類或枚舉的別名聲明,
- 使用申述,
- using指令,
- 而且只有一個退貨聲明;
到黑名單:
它的函數體應為= delete,= default或不包含的復合語句
- asm-definition,
- 一個goto聲明,
- 嘗試塊,或
- 非文字類型或靜態或線程存儲持續時間的變量的定義,或者不執行初始化的定義。
並在C.3.3
第7節中增加了以下注釋:聲明:
更改:constexpr非靜態成員函數不是隱式const成員函數。
基本原理:必須允許constexpr成員函數改變對象。
對原始功能的影響:有效的C ++ 2011代碼可能無法在本國際標准中編譯。 例如,以下代碼在C ++ 2011中有效,但在本國際標准中無效,因為它使用不同的返回類型聲明了兩次相同的成員函數:
struct S { constexpr const int &f(); int &f(); };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.