为什么这种未定义的行为?

xry*_*669 2 c++ clang undefined-behavior

这是示例代码:

X * makeX(int index) { return new X(index); }
struct Tmp {
    mutable int count;
    Tmp() : count(0) {}
    const X ** getX() const { 
        static const X* x[] = { makeX(count++), makeX(count++) };
        return x; 
    }
};
Run Code Online (Sandbox Code Playgroud)

这将在静态数组构造中报告CLang build 500上的Undefined Behavior.为了简化这篇文章,计数不是静态的,但它不会改变任何东西.我收到的错误如下:

test.cpp:8:44:警告:对'count'的多次无序修改[-Wunsequenced]

Mik*_*our 10

在C++ 11中,这很好; 初始化列表的每个子句在下一个列表之前排序,因此评估是明确定义的.

从历史上看,这些条款可能没有排序,因此两个count未经修改的条款会给出未定义的行为.

(虽然,正如评论中所指出的那样,它可能已经定义得很好 - 你可以将标准解释为暗示每个子句都是一个完整表达式,并且在每个完整表达式的末尾都有一个序列点.我会留给历史学家来讨论过时语言的细节.)