clang的行为与msvc ++和gcc不同

时间:2013-11-22 20:01:57

标签: c++ compiler-construction

这段代码在Clang上表现得令人惊讶。 Clang中有错误,还是gcc和MSVC ++错了?或者行为未定义?:

typedef set<int> A;
typedef map<int,A> B;
B gcctest;
A def;

A const& get(int key)
{
    B::const_iterator j = gcctest.find(key);
    if (j != gcctest.end())
        return j->second;
    return def;
}

int main()
{
    def.insert(1);
    int t = 47;
    gcctest[t] = get(t);
    cerr << (gcctest[t].size() ? "gcc or msvc++" : "clang") << endl;
}

在调用get之前,似乎Clang在我的地图中插入了一个默认的构造元素。如果A是一个简单类型,例如, int

在GCC和MSVC ++++上打印gcc或msvc ++。在打印铿锵声中。

Linux版本4.6.3上的GCC

Clang on MacOS Xcode 5.0.2

Windows VS2012上的MSVC ++

(PS:请帮助我为这个问题提供更好的标题。)

1 个答案:

答案 0 :(得分:2)

当您在std::map<K, T>上使用下标运算符时,它会找到该元素,如果该元素不存在,则插入一个元素。因此,取决于是左侧还是右侧

gcctest[t] = get(t);
首先评估

,你会得到不同的结果。然而,该计划的结果尚未明确。