gpt4 book ai didi

c++ - 基类中的虚拟无关方法导致MSVC编译失败时的模板类方法实例化

转载 作者:太空狗 更新时间:2023-10-29 21:33:10 26 4
gpt4 key购买 nike

下面的代码是合法的 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 Implicit instantiation [temp.inst]

9 … It is unspecified whether or not an implementation implicitly instantiates a virtual member function of a class template if the virtual member function would not otherwise be instantiated.

关于c++ - 基类中的虚拟无关方法导致MSVC编译失败时的模板类方法实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52431875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com