一个C++右值引用的问题

时间:2023-03-09 19:32:02
一个C++右值引用的问题

暂时先不更新前一篇文章了,感觉那个文章要写好久。累死。

今天说一说C++右值引用的一个问题。

这个问题的发现也是很偶然的。

来一段毫无意义但是能证明问题的代码:

 std::string &&
get_string()
{
return "hello world";
} int main()
{
auto s1 = get_string();
auto const s2 = get_string();
auto const & s3 = get_string(); std::cout << s1 << std::endl;
std::cout << s2 << std::endl;
std::cout << s3 << std::endl; return ;
}

请问控制台输出神马?

自己跑一跑看一看,然后咱们下一个结论:

!!返回值不要搞成右值引用的样子!!

当然了,在这个简单的案例里面,你还能看到编译器报警。但是复杂的时候可能就看不到了。这个问题发生在我自己封装的访问optional::value()的函数里:

 template <typename T>
T &&
value(optional<T> && v)
{
#if defined TKAT_APPLE_CLANG && TKAT_APPLE_CLANG <= 9020039
// https://*.com/questions/44217316/how-do-i-use-stdoptional-in-c
return std::move(*std::move(v));
#else # if !defined NDEBUG
try
{
return std::move(v).value();
}
catch (std::bad_optional_access const & eh)
{
TKAT_LOG_TEST_ENVIRONMENT(eh.what());
throw;
}
# else
return std::move(v).value();
# endif #endif
}

完!