一個C++右值引用的問題

暫時先不更新前一篇文章了,感受那個文章要寫很久。累死。函數

今天說一說C++右值引用的一個問題。spa

這個問題的發現也是很偶然的。code

來一段毫無心義可是能證實問題的代碼:blog

 1 std::string &&
 2 get_string()
 3 {
 4   return "hello world";
 5 }
 6 
 7 int main()
 8 {
 9   auto s1 = get_string();
10   auto const s2 = get_string();
11   auto const & s3 = get_string();
12 
13   std::cout << s1 << std::endl;
14   std::cout << s2 << std::endl;
15   std::cout << s3 << std::endl;
16 
17   return 0;
18 }

請問控制檯輸出神馬?get

本身跑一跑看一看,而後我們下一個結論:編譯器

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

固然了,在這個簡單的案例裏面,你還能看到編譯器報警。可是複雜的時候可能就看不到了。這個問題發生在我本身封裝的訪問optional::value()的函數裏:io

 1 template <typename T>
 2 T &&
 3 value(optional<T> && v)
 4 {
 5 #if defined TKAT_APPLE_CLANG && TKAT_APPLE_CLANG <= 9020039
 6   // https://stackoverflow.com/questions/44217316/how-do-i-use-stdoptional-in-c
 7   return std::move(*std::move(v));
 8 #else
 9 
10 # if !defined NDEBUG
11   try
12   {
13     return std::move(v).value();
14   }
15   catch (std::bad_optional_access const & eh)
16   {
17     TKAT_LOG_TEST_ENVIRONMENT(eh.what());
18     throw;
19   }
20 # else
21   return std::move(v).value();
22 # endif
23 
24 #endif
25 }

 

完!編譯

相關文章
相關標籤/搜索