constexpr静态成员什么时候停止成为constexpr?

时间:2018-04-27 17:23:55

标签: c++ c++17 constexpr if-constexpr

我有这个片段。

[0.21960786 0.23529413 0.27058825]

我的问题是:#include <iostream> #include <string> struct JustStr { JustStr(const std::string& x) : val(x) {} static constexpr bool pred = false; std::string val; }; template <typename T> class C { private: T x; public: C(T x_) : x(x_) {} void f() { if constexpr (!x.pred) { std::cout << x.val << std::endl; } } }; template<typename T> void f2(T x) { T y(x); if constexpr (!y.pred) { std::cout << x.val << std::endl; } } int main() { C<JustStr> c(JustStr("yes")); c.f(); // Fails f2(JustStr("yes")); // Succeeds return 0; } c.f();不应该同时失败或成功吗?为什么一个失败了,为什么另一个失败?

1 个答案:

答案 0 :(得分:6)

list of things阻止表达式被视为核心常量表达式。

你不能做的一件事就是评估:

  

this,但constexpr函数或constexpr构造函数除外,它被评估为e的一部分;

f()中,我们正在评估this以查看x.pred是什么(因为它真的是this->x.pred),但是{{ 1}} isn&#39; ta constexpr功能。所以这个要点排除了f()。如果c.f() f(),则会编译。

constexpr中,我们并未在任何地方评估f2(),因此该子弹不适用。我们进行左值到右值的转换,但确实引用了complete non-volatile const object with a preceding initialization, initialized with a constant expression。没有其他条件适用。所以没关系。