测试仅在 travis-ci 上失败;不支持 RTTI?

Test failing only on travis-ci; RTTI not supported?

我有一个相当简单的测试,它在 travis-ci 持续集成服务器上失败了,但我无法重现失败。 CI 服务器似乎不支持 RTTI,但据我所知,无法在 gcc 上关闭 RTTI。

我想知道我是否在这里依赖未定义的行为,这就是导致差异的原因。谁能告诉我为什么这可能会不一致地失败?

#include <catch.hpp>

template <typename T, typename U>
T * As(U * Object)
{
    return dynamic_cast<T *>(Object);
}

class Base
{
public:
    Base() {}
    virtual ~Base() {}
};

class Derived : public Base
{};


{
    // in tests...
    Derived b;

    REQUIRE(As<Derived>((Base*)&b) == &b);
}

当我在各种架构上运行时,上面的测试总是通过,但在 travis-ci 上失败,扩展如下:

__null == 0x00007ffd6d95fe70

所以 As<Derived>((Base*)&b) 是 returning null 而我期待它 到 return 一些非空值。我们可以明显地看到 b 实际上是一个 Derived 实例——我是不是在我的各种强制转换和取消引用中做错了什么?

我将此作为对问题的评论发布,但认为它应该在答案部分。事实证明我有多个编译单元 类 称为 BaseDerived 并且在链接时它引起了冲突。更改 类 的名称解决了问题。