我对使用clang 3.9编译的此代码的行为感到有些困惑:
struct A {
constexpr A() = default;
A(const A&) = delete;
constexpr A(A&&) {}
A& operator =(const A&) = delete;
constexpr A& operator =(A&&) { return *this; }
constexpr operator bool() const { return &self == this; }
private:
A& self{*this};
};
constexpr A fooA() { return {}; }
int main(int argc, const char * argv[]) {
static_assert(fooA(), "");
return fooA();
}
Godbolt链接:https://godbolt.org/g/CDFXAc 对于
fooA
,静态/编译时评估已正确进行;然而在运行时,构造函数似乎被完全省略了。 static_assert
没有触发(如预期的那样),但是main函数仍然返回0。这是因为A
是字面类型还是编译器bug呢?如果是前者,请提供任何与标准相关的参考资料。