portability-template-virtual-member-function

查找模板类中未实例化的虚成员函数导致跨编译器不兼容的情况。

在实例化模板类时,非虚成员函数只有在使用时才需要实例化。另一方面,虚成员函数的实例化是未指定的,并且取决于编译器的实现。

在以下代码片段中,虚成员函数没有被 GCC 和 Clang 实例化,但它被 MSVC 实例化,因此虽然代码片段被前者编译器接受,但被后者拒绝。

template<typename T>
struct CrossPlatformError {
    virtual ~CrossPlatformError() = default;

    static void used() {}

    virtual void unused() {
        T MSVCError = this;
    };
};

int main() {
    CrossPlatformError<int>::used();
    return 0;
}

需要在 Windows 上支持 MSVC 的跨平台项目可能会遇到编译器错误,因为某些虚成员函数被实例化,而这些函数没有被其他平台上的其他编译器实例化。此检查会突出显示这些虚成员函数。