文本类型在运行时的令人惊讶的行为

时间:2017-03-02 21:57:09

标签: c++ clang c++14

我对使用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是文字类型还是因为编译器错误?

如果是前者,我们将不胜感激。

2 个答案:

答案 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>