Отброшенная ветвь C++ constexpr, если компиляция не удалась, поскольку она вызывает несовпадающую функцию.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Отброшенная ветвь C++ constexpr, если компиляция не удалась, поскольку она вызывает несовпадающую функцию.

Сообщение Anonymous »

У меня есть функция, которая принимает входные данные произвольного диапазона и варианта. Если и тип варианта, и входные данные являются строками, я хочу вызвать функцию, обрабатывающую строку.
Функция находится в контексте шаблона, поэтому моя интуиция подсказывает мне, что код обработки строки следует отбросить и скомпилировать. Это надуманный пример, и меня интересуют не обходные пути, а понимание основной проблемы и того, какая часть стандарта требует этого.
Кроме того, если я заменю цикл на 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});
}
Глядя на страницу if в cppreference, я думаю, что это соответствующие кавычки.

Если оператор constexpr if появляется внутри шаблонной сущности, и если условие не зависит от значения после создания экземпляра, экземпляр отброшенного оператора не создается при создании экземпляра включающего шаблона.
....
Условие остается зависимым от значения после того, как создание экземпляра является вложенным шаблоном:

но я просто не могу указать точную причину сбоя.

Подробнее здесь: https://stackoverflow.com/questions/798 ... s-non-matc
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»