昨天一個朋友 checkout 了個人 febird 代碼,編譯時出現了一個詭異的錯誤。通過仔細勘察,他的 g++ 版本是 4.7.3,而我測試過的 g++4.7.2,g++4.8.2均無問題。測試
後來修改代碼,解決了那個問題,但要還原那個bug時,很費了一番力氣。如下是還原的那個 bug 的一段簡單代碼,不過可能不是最簡單的。code
#include <stdio.h> struct A { int x = 10; }; template<class> struct B : A { static void foo(A* a) { // auto b = static_cast<B*>(a); // g++ 4.7.3 compile OK auto* b = static_cast<B*>(a); // g++ 4.7.3 compile error auto lamb = [&](A*) { printf("a.x=%d\n", b->x); }; lamb(a); } }; int main() { A a; B<int>::foo(&a); return 0; }
g++4.7.3 出錯的緣由在於,將 b 的類型推導成了 B<int>*&,而引用不能綁定到 prvalue 上!關於什麼事 prvalue,須要你去參考 C++ 標準。blog