Допустим, у меня есть функция:
#include <optional>
template <typename T>
std::optional<T> foo(T const &input);
Она принимает значение, пытается работать с его копией и возвращает указанную копию в случае успеха (std::nullopt
в случае ошибки).
Но проблема в том, что когда строковый литерал передается в такую функцию, возникает ошибка T in optional<T> must meet the Cpp17Destructible requirements
.
Это вызвано static_assert(is_object_v<_Ty> && is_destructible_v<_Ty> && !is_array_v<_Ty>, ...)
, определенным в <optional>
.
Следующая Выражение работает правильно:
foo((char const*) "bar");
Это ошибка:
foo("bar");
Вопрос в том, как заставить компилятор неявно преобразовывать char const[]
в char const*
?
PS Я знаю, что это можно сделать, просто перегрузив функцию, поскольку я не слишком заинтересован в дублировании кода, которое она вызывает, поэтому мне интересно, применимо ли здесь альтернативное решение.