我对使用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
是文字类型还是因为编译器错误?
如果是前者,我们将不胜感激。
答案 0 :(得分:2)
这是一个更简化的例子:
struct A {
constexpr A() : self(this) { }
A* self;
};
int main() {
constexpr A a{};
}
gcc和clang都不接受此代码,因为他们不喜欢在初始化程序中使用this
。但是,this
只允许在constexpr
构造函数中使用sudo apt-get update
sudo apt-get install libpcap0.8-dev
,因为N3652。 MSVC做对了。
答案 1 :(得分:-2)
问题是输出取决于是否执行了复制省略(如果没有,self
被初始化为临时,因此fooA()
变为非常量且其声明格式错误,那么你得到意外的行为。在标准中,在这个上下文中没有强烈的复制省略要求(对于c ++ 14),所以你从不同的编译器得到不同的行为。你可以在这个问题中得到更多关于这个问题的细节report < / p>