假设我有一个函数。
#include <optional>
template <typename T>
std::optional<T> foo(T const &input);
它接受一个值,尝试使用它的一个副本,并在成功后返回该副本 (std::nullopt
on fail)。)
但问题是,当一个字符串文字传递到这样的函数中时,会出现一个错误 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*
?
P. S. 我知道可以通过简单的重载函数来实现,但我不太喜欢重载函数造成的代码重复,所以我很好奇是否有另一种解决方案适用于这里。
虽然考虑到不需要太多重复,但这并不是你真正想要的。
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);
}
编辑: 重写了答案. 有了返回类型的推导,这样就方便了。
template <typename T>
auto foo(T const &input){
auto copy {std::move(input)};
// ...
return std::optional{std::move(copy)};
}