我有以下C++14 lambda
#include <boost/optional.hpp>
int main(){
auto foo = [](auto && t)
{
using T = decltype(t);
return boost::optional<T>(std::forward<T>(t));
};
// This is fine because i is lvalue
auto i = 10;
foo(i);
// This fails because i is rvalue
foo(10);
}首先请注意,boost::optional可以包含左值引用,但不能包含右值引用。
是否可以使用上面的泛型lambda将rvalue作为副本处理。我想要的是像这样聪明的东西
using T = std::decay_if_rvalue<decltype(t)>::type有没有什么开箱即用的东西可以做到这一点?
发布于 2021-02-09 14:55:31
您可以将std::is_rvalue_reference与std::conditional一起使用,两者都来自<type_traits>标头。
auto foo = [](auto && t)
{
using Orig = decltype(t);
using T = std::conditional_t<std::is_rvalue_reference<Orig>::value,
std::decay_t<Orig>, Orig>;
return boost::optional<T>(std::forward<T>(t));
};https://stackoverflow.com/questions/66114232
复制相似问题