Неоднозначное создание экземпляра шаблона

Может ли кто-нибудь объяснить двусмысленность здесь?

template <typename...> struct thing;

template <typename... Rest>
struct thing<int&, Rest&...> {
    thing(int&, Rest&...) { }
};

template <typename First, typename... Rest>
struct thing<First&, Rest&...> {
    thing(First&, Rest&...) { }
};

int main() {
    int myint;
    char mychar;
    thing<int&, char&> t(myint, mychar);
}

person prestokeys    schedule 27.11.2017    source источник
comment
ну что ты имеешь в виду? Тот, который принимает 1 + другие аргументы, или тот, который принимает 2 + другие аргументы?   -  person UKMonkey    schedule 27.11.2017
comment
Разве первая специализация не более специализирована, чем вторая? Он должен взять первый автоматически, верно?   -  person prestokeys    schedule 27.11.2017
comment
Clang 6 не имеет с этим проблем.   -  person AndyG    schedule 27.11.2017
comment
Это может быть ошибка компилятора.   -  person freakish    schedule 27.11.2017
comment
GCC 7.2 комп. Это работает, когда я удаляю ссылки из типов.   -  person prestokeys    schedule 27.11.2017
comment
Любое обходное решение здесь, если я должен заставить это работать с GCC 7.2? Возможно, где-то используется std::enable_if_t<!std::is_same_v<First, int>>* = nullptr?   -  person prestokeys    schedule 27.11.2017
comment
Вы можете использовать template <typename ... Ts> struct thing<Ts&...> : thing_for_ref<Ts...> {} (а затем специализироваться на thing_for_ref) в качестве обходного пути.   -  person Jarod42    schedule 27.11.2017
comment
Последний msvc (19.11.25547) тоже без проблем, по крайней мере после инициализации переменных.   -  person SoronelHaetir    schedule 27.11.2017


Ответы (1)


если вы специализируетесь на int вместо int&, это работает

template <typename...> struct thing;

template <typename... Rest>
struct thing<int, Rest...> {
    thing(int&, Rest&...) { }
};

template <typename First, typename... Rest>
struct thing<First, Rest...> {
    thing(First&, Rest&...) { }
};
person sp2danny    schedule 23.10.2018