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

Ole*_*nov 7 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();
}
Run Code Online (Sandbox Code Playgroud)

Godbolt链接:https://godbolt.org/g/CDFXAc

静态/编译时评估正确地发生fooA; 但是在运行时,构造函数似乎完全被省略.该static_assert不会触发(如预期),但主要还是返回0.是不是因为A是文字型还是因为编译器错误的?

在前者的情况下,任何对标准的引用都将受到赞赏.

dla*_*ila -2

问题是输出取决于是否执行复制省略(如果不执行,self则初始化为临时变量,因此fooA()变为非 const 并且其声明格式错误,然后您会得到意外的行为。在标准中没有强烈的要求在此上下文中复制省略(对于 c++14),以便您从不同的编译器中获得不同的行为。您可以在此报告中获取此问题的更多详细信息