Функция находится в контексте шаблона, поэтому моя интуиция подсказывает мне, что код обработки строки следует отбросить и скомпилировать. Это надуманный пример, и меня интересуют не обходные пути, а понимание основной проблемы и того, какая часть стандарта требует этого.
Кроме того, если я заменю цикл на std::ranges::for_each, код компилируется. Почему?
Код: Выделить всё
#include
#include
#include
namespace ranges = std::ranges;
void do_string(std::string_view) {}
template
constexpr bool is_string = std::is_same_v;
template
void f(T&& input_data, std::variant var) {
using InputValueType = std::decay_t;
std::visit(
[&](auto&& type) {
using NestedType = std::decay_t;
if constexpr (is_string && is_string) {
for (auto&& str : input_data) {
do_string(std::forward(str));
}
// If I replace the loop above with the for_each it compiles.
//std::ranges::for_each(input_data, [](auto&& v){ do_string(v);});
}
},
var
);
}
int main() {
f(std::ranges::views::iota(int{0}, int{10}), std::variant{0});
}
Если оператор constexpr if появляется внутри шаблонной сущности, и если условие не зависит от значения после создания экземпляра, экземпляр отброшенного оператора не создается при создании экземпляра включающего шаблона.
....
Условие остается зависимым от значения после того, как создание экземпляра является вложенным шаблоном:
но я просто не могу указать точную причину сбоя.
Подробнее здесь: https://stackoverflow.com/questions/798 ... s-non-matc
Мобильная версия