我似乎无法在标准中找到一个引人注目的通道或示例,它直接解决了在非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