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



假设我有一个函数:

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

它接受一个值,尝试使用它的副本,并在成功时返回所述副本(失败时返回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*

第页。S.我知道这可以通过简单地重载函数来完成,因为我不太喜欢它引起的代码重复,所以我很好奇是否有替代解决方案适用于此。

编辑:改写答案。有了退货类型的扣除,这会很方便。
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); 
}

最新更新