当基类中的虚拟无关方法导致MSVC上的编译失败时,模板类方法实例化

狡猾

以下代码是否合法C ++?

MS Visual C ++失败,但是gcc和clang都可以:https : //godbolt.org/z/vsQOaW

可能是msvc错误,但想先检查一下:

struct Base {
    virtual void junk() = 0;
};

template <class T>
struct Derived : Base {

    void junk() override {
        T::junkImpl();
    }

    void otherMethod() {
    }
};


template <class T>
struct NotDerived {

    void junk() {
        T::junkImpl();
    }

    void otherMethod() {
    }
};


struct TypeWithJunk {
    void junkImpl() {
    }
};

struct TypeWithoutJunk {};


void reproduce(NotDerived<TypeWithoutJunk>* ndt, Derived<TypeWithoutJunk>* dt) {

    // works - junk is not used, not instantiated
    ndt->otherMethod();

    // fails on MSVC - junk is instantiated even if not used
    dt->otherMethod();
}
用户名

junk可能像其他虚拟函数一样被实例化,因为填充vtable是必需的。因此,所有编译器似乎都展示出符合标准的行为:

17.8.1隐式实例化[temp.inst]

9…如果未以其他方式实例化虚拟成员函数,则不确定实现是否隐式实例化类模板的虚拟成员函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使编译在模板类的特定实例化上失败

实例化类模板的方法模板

当类型是指针时,模板类方法专门化失败

当功能模板调用类模板的静态方法模板时,为什么编译失败?

基类中编译时派生模板类的大小

当基类的虚拟方法隐藏发生时,如何强制发生编译错误?

使用参数实例化模板类的类成员的正确方法

在C ++中,是否有一种(新的)方法可以在不实例化实例的情况下测试类在模板中是否具有虚拟析构函数?

从基类的静态模板方法中调用继承类的受保护ctor失败

在类模板中实例化功能模板时?

基类的工厂方法实例化派生类

在Sfinae中使用模板化类时定义纯虚拟方法

模板类方法的部分专业化或实例化

改进模板化类中的编译时错误消息

实例化类在Scala中的通用方法

在PHP中实例化类的正确方法

在 Python 中的“模板方法模式”继承中,对从基类继承的方法使用派生类上已实现方法的签名

从基类的虚拟方法访问时,TestContext为null

实例化类时是否实例化了类模板的成员?

如何复制带有虚拟基类的模板实例?

模板基类的调用方法

MSVC导致虚拟方法崩溃

类模板的成员函数的显式实例化声明是否导致类模板的实例化?

C#创建类实例以在类中执行方法时

在基类构造函数中调用虚拟方法

从基类调用方法时,父类中的值尚未初始化

通过通用方法进行接口基类的实例化

具有模板方法的 C++ 类具有许多实例,在编译时消耗大量内存

SFINAE方法完全禁用clang中基类的模板方法