Извлекает элемент кортежа по типу и неоднозначности

Статья утверждает, что бесплатно std::get функциональные перегрузки (от 4-6 ед.) они

Извлекает элемент кортежа t, тип которого T. Не компилируется, если кортеж имеет более одного элемента этого типа.

Последнее утверждение является требованием или просто возможностью?

Я задаю вопрос, потому что std::get< int >(std::make_tuple(1, 2)) хорошо компилируется clang++ -std=gnu++1z -stdlib=libc++ (живой пример). Поведение этого кортежа Libc ++ ошибка или один соответствует стандарту?

1

Решение

Из стандарта §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 компилирует.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]