не знаю, из какой версии хром это доступно, но я нашел настройку «Консоль - Log XMLHttpRequests» (нажав на значок в правом нижнем углу инструментов разработчика в chrome на mac)
std::get<T>
явно не для SFINAE, как указано в [tuple.elem]:
template <class T, class... Types> constexpr T& get(tuple<Types...>& t) noexcept; // and the other like overloads
Требуется: Тип
T
встречается ровно один раз вTypes...
. В противном случае, программа является плохо сформированной.
std::get<I>
также явно не SFINAE.
Что касается других вопросов:
Есть ли причина для
std::get
не быть SFINAE-дружественными?
Не знаю. Как правило, это не тот вопрос, который нужно обсуждать. Так что я думаю, это не считалось чем-то, что нужно было сделать. Сложные ошибки намного легче понять, чем пролистывать кучу нежизнеспособных вариантов кандидатов. Если вы считаете, что есть веская причина для того, чтобы std::get<T>
был дружественным по отношению к SFINAE, вы можете отправить об этом вопрос LWG.
Есть ли лучший обходной путь, чем описанный выше?
Конечно. Вы можете написать свою собственную дружественную SFINAE версию get
(обратите внимание, она использует C ++ 17 сложенное выражение ):
template <class T, class... Types,
std::enable_if_t<(std::is_same<T, Types>::value + ...) == 1, int> = 0>
constexpr T& my_get(tuple<Types...>& t) noexcept {
return std::get<T>(t);
}
И затем делать это по своему желанию ,