c++ - clang 的行为不同于 msvc++ 和 gcc

标签 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;
}

似乎 Clang 在调用 get 之前在我的 map 中插入了一个默认构造的元素。如果 A 是简单类型,则不会发生这种情况,例如int.

在 GCC 和 MSVC++++ 上它打印 gcc 或 msvc++。在 clang 打印 clang 上。

Linux 版本 4.6.3 上的 GCC

MacOS Xcode 5.0.2 上的 Clang

Windows VS2012 上的 MSVC++

(PS:请帮我为这个问题起一个更好的标题。)

最佳答案

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

gcctest[t] = get(t);

首先被评估,你会得到不同的结果。然而,程序的结果是不确定的。

关于c++ - clang 的行为不同于 msvc++ 和 gcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153491/

相关文章:

c++ - 为什么每次使用 CFileDialog 时都会出现异常?

memory - 编译器如何在内存中布局代码

compiler-construction - 将抽象语法树转换为字节码

c++ - 编译器会删除始终计算为零的 If block 吗?

java - 编译由 Ragel 6.7 生成的 java 代码时出错

java - 将 Java 中的 C++ DLL 与 JNA 结合使用

c++ - 在闭源库中使用 STL

c++ - 在这种情况下是否存在内存泄漏?

c++ - 设备内存空间中的cuda程序内核代码

java - 为什么在实例(Java)上调用方法时不需要导入类