создание экземпляра метода класса шаблона, когда виртуальный несвязанный метод в базовом классе вызывает ошибку компиляции в MSVC - PullRequest
0 голосов
/ 20 сентября 2018

Является ли следующий код допустимым для 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();
}

1 Ответ

0 голосов
/ 20 сентября 2018

junk может создаваться так же, как остальные виртуальные функции, потому что это необходимо для заполнения vtable.Таким образом, похоже, что все компиляторы демонстрируют соответствующее поведение:

17.8.1 Неявное создание экземпляров [temp.inst]

9… Не указано, является лиреализация неявно создает экземпляр виртуальной функции-члена шаблона класса, если в противном случае функция виртуального члена не будет создана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...