Статья утверждает, что бесплатно std::get
функциональные перегрузки (от 4-6 ед.) они
Извлекает элемент кортежа t, тип которого T. Не компилируется, если кортеж имеет более одного элемента этого типа.
Последнее утверждение является требованием или просто возможностью?
Я задаю вопрос, потому что std::get< int >(std::make_tuple(1, 2))
хорошо компилируется clang++ -std=gnu++1z -stdlib=libc++
(живой пример). Поведение этого кортежа Libc ++ ошибка или один соответствует стандарту?
Из стандарта §20.4.2.6 / 8 требования:
Требуется: тип T встречается ровно один раз в типах …. В противном случае программа некорректна.
Таким образом, ваша программа плохо сформирована.
Стандарт даже предоставляет пример, который очень похож на вашу ситуацию:
const tuple<int, const int, double, double> t(1, 2, 3.4, 5.6);
const int &i1 = get<int>(t); // OK. Not ambiguous. i1 == 1
const int &i2 = get<const int>(t); // OK. Not ambiguous. i2 == 2
const double &d = get<double>(t); // ERROR. ill-formed
что если вы подключить Clang компилирует.
Других решений пока нет …