2016-09-27 120 views
17

根據this,與constexpr聲明的函數必須滿足幾個要求,其中之一是如下:constexpr函數必須有一個參數值?

存在至少一個參數值使得函數的調用可以被評估核心常量表達式的子表達式...

好,constexpr功能可以沒有參數

constexpr int Bar(/* empty */) { return 0xFF; } 
constexpr int value = Bar(); // Valid expression 

constexpr作爲子程序調用的函數無法將整個表達式確定爲核心常量表達式。

那麼一個參數的值是什麼意思

[更新爲未來的讀者]

顯然關於constexpr function要求的描述中已被固定,因爲從這樣一個問題:

存在至少一個參數值使得函數的調用可以是核心常量表達式的評估子表達式...

到:

存在至少一組參數的值使得函數的調用可以是芯常量表達式的評估子表達式...

+3

我*認爲*這意味着*爲每個參數*至少存在等。 –

+0

@MartinBonner不,它意味着所有參數作爲一個整體 –

回答

19

en.cppreference.com引證是在問候標準不準確的,真正的報價(§ 7.1.5/5):

對於constexpr功能或構造constexpr既不是默認的也不一個模板,如果沒有參數值存在,使得函數或構造函數的調用可以是核心常量表達式的一個評估子表達式(5.20)[...]該程序不合格;不需要診斷。

基本上說,必須存在一個有效的參數集合(在你的情況下,空集合是一個有效的集合)。

+2

所以,他們搞砸了措辭的顛倒。 – Yakk

+0

如果空集也被認爲是一個有效集,我們甚至可以少於'一組參數值'嗎? (因爲每個函數必須至少有一個集合,包括一個空集合。)我只是好奇,如果這只是編寫標準的一些形式。 –

+1

@DeanSeo你可以有少於一個**有效**參數集合 - 'constexpr int f(std :: string)'是無效的,因爲'std :: string'不能是'constexpr',所以無論' f'可能是,那麼永遠不會有一組有效的參數使'f'的調用成爲一個常量表達式。 – Holt

7

「的一個論點價值「在這裏意味着」一組參數「。 Nullary函數有一個可能的參數集,即空集。

在你的情況,這個單一的空參數集確實會導致有效的constexpr調用,所以一切都很好。