我有这个片段。
[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();
不应该同时失败或成功吗?为什么一个失败了,为什么另一个失败?
答案 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。没有其他条件适用。所以没关系。