暫時先不更新前一篇文章了,感受那個文章要寫很久。累死。函數
今天說一說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 }
完!編譯