一個C++右值引用的問題
暫時先不更新前一篇文章了,感覺那個文章要寫好久。累死。
今天說一說C++右值引用的一個問題。
這個問題的發現也是很偶然的。
來一段毫無意義但是能證明問題的代碼:
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 }
請問控制臺輸出神馬?
自己跑一跑看一看,然后咱們下一個結論:
??!返回值不要搞成右值引用的樣子??!
當然了,在這個簡單的案例里面,你還能看到編譯器報警。但是復雜的時候可能就看不到了。這個問題發生在我自己封裝的訪問optional::value()的函數里:
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 }
完!
posted on 2018-08-22 22:25 wpcockroach 閱讀(220) 評論(0) 收藏 舉報
浙公網安備 33010602011771號