簡體   English   中英

在C ++ 14中,constexpr成員可以更改數據成員嗎?

[英]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的一部分:放寬對co​​nstexpr函數的約束,這改變了第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.

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