这段代码在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:请帮助我为这个问题提供更好的标题。)
答案 0 :(得分:2)
当您在std::map<K, T>
上使用下标运算符时,它会找到该元素,如果该元素不存在,则插入一个元素。因此,取决于是左侧还是右侧
gcctest[t] = get(t);
首先评估,你会得到不同的结果。然而,该计划的结果尚未明确。