如何在模板实例化中强制将 char[] 转换为 char*?

How do I force conversion char[] to char* in template instantiation?

假设我有一个函数:

#include <optional>

template <typename T>
std::optional<T> foo(T const &input);

它接受一个值,尝试使用它的副本,returns 说复制成功(std::nullopt 失败)。

但问题是,当将字符串文字传递给此类函数时,会发生错误T in optional<T> must meet the Cpp17Destructible requirements

<optional>中定义的static_assert(is_object_v<_Ty> && is_destructible_v<_Ty> && !is_array_v<_Ty>, ...)引起。

下一个表达式正确运行:

foo((char const*) "bar");

这个失败了:

foo("bar");

问题是,我如何强制编译器将 char const[] 隐式转换为 char const*

P. S. 我知道这可以通过简单地重载函数来完成,因为我不太热衷于它导致的代码重复,所以我很好奇这里是否有替代解决方案。

编辑:重写了答案。有了return类型推导,这样就方便了。

template <typename T>
auto foo(T const &input){
    auto copy {std::move(input)};
    // ...
    return std::optional{std::move(copy)};
}

不是您真正要求的,但认为不需要太多重复:

template <int s>
std::optional<const char*> foo(const char (&str)[s]) {
    return foo(&str[0]);
}

或更简单:

std::optional<char const*> foo(char const *input) { 
    return foo<char const *>(input); 
}