Каковы правила создания экземпляра шаблона, когда мы передаем (мульти) производный класс функции шаблона, ожидающей базовый класс? Например:Создание экземпляра шаблона с множественным наследованием шаблонов
#include <iostream>
template <int x>
struct C {};
struct D : C<0>, C<1> {};
template <int x>
void f (const C<x> &y) { std::cout << x << "\n"; }
int main()
{
f (D());
}
MSVC 2015 оттисков 0, лязг 3.8 - 1 и GCC 6.2 дает ошибку компилятора (Demo). И даже если вы SFINAE одноразовых все перегрузки, кроме одного, то результат все равно будет отличаться:
#include <iostream>
template <int x> struct C {};
template<>
struct C<0> { using type = void; };
struct D : C<0>, C<1> {};
template <int x, typename = typename C<x>::type>
void f (const C<x> &y) { std::cout << x << "\n"; }
int main()
{
f (D());
}
Теперь он собирает только с MSVC, и если вы поменяться C<0>
и C<1>
только лязг будет компилировать его. Проблема заключается в том, что MSVC пытается слишком рано создавать ошибки первой базы, clang-last и gcc-prints. Какой компилятор прав?
Мне кажется, что они все ошибаются. Разве это не двусмысленный вызов функции? –
* «MSVC печатает 0, clang - 1 и gcc дает ошибку компилятора.» *, Какой MSVC, какой gcc и который clang? –
@PiotrSkotnicki Добавлены номера версий, но все они ведут себя одинаково –