假设我有一个函数:
#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);
}