Вот два способа решения этой проблемы:
class Var {
public:
#ifdef BROKEN
template <typename T>
Var(T x, typename std::enable_if<std::is_convertible<T, int>::value>::type* = nullptr) : value(x) {}
#else
Var(int x) : value(x) {}
#endif
int value;
};
Демоверсия .
Или:
class Class {
public:
Class(std::vector<Var> arg) : v(arg) {}
std::vector<Var> v;
};
Live demo .
Теперь, по-видимому, в случае gcc пытается использовать параметр шаблона в качестве списка инициализации.Когда используются фигурные скобки и определен список инициализации, список инициализации имеет более высокий приоритет, чем конструктор копирования.
Таким образом, добавление правильного enable_if
решает проблему, поскольку защищает от создания версии конструктора из списка инициализации.В C ++ 20 концепции решат эту проблему лучше.
И когда вместо скобок для инициализации используется v
, список инициализации не является предпочтительным.
Я не уверен, ктоверно (IMO лязг, но это просто внутреннее чувство).Может быть, кто-то, кто знает стандарт лучше, может сказать.