我似乎無法在標準中找到一個引人注目的通道或示例,它直接解決了在非constexpr實例上調用constexpr成員函數的問題,但這裏有些可能有所幫助(來自草案N4140 ):
[C++14: 7.1.5/5]
:
對於非模板,非缺省constexpr
功能或非模板,非默認的,非繼承 constexpr
構造中,如果沒有參數的值是否存在,使得調用函數或構造函數 可能是一個eval一個核心常量表達式(5.19)的子表達式,該程序是不合格的;沒有 需要診斷。
constexpr int f(bool b)
{ return b ? throw 0 : 0; } // OK
constexpr int f() { return f(true); } // ill-formed, no diagnostic required
從這個我認爲這個節目是不是完全形成不良僅僅因爲一個constexpr函數有一個可能的非constexpr路徑。
[C++14: 5.19]
:
int x; // not constant
struct A {
constexpr A(bool b) : m(b?42:x) { }
int m;
};
constexpr int v = A(true).m; // OK: constructor call initializes
// m with the value 42
constexpr int w = A(false).m; // error: initializer for m is
// x, which is non-constant
這是稍微接近於您的示例程序,這裏constexpr構造可以根據參數的值引用非constexpr變量,但沒有錯誤,如果這條道路是沒有實際採取。
所以我不認爲你呈現兩個程序應該形成不良的,但我不能提供令人信服地證明:)
的成員函數省略常量是無意的,雖然我不知道,如果它會影響示例的不合理性(或其他方面)。以防萬一。 –
爲了清晰起見,我還將默認構造的S更改爲第二個示例中的局部變量。 –
我自己並不是100%,但是它只調用函數顯然作爲const操作的語義問題,但不是(或不是)聲明爲const,所以如果S傳遞爲一個const&S或類似的f()被調用。我實際上以爲你在這裏測試美國;) – JVene