gcc 4.7.3 的一個 c++11 bug

昨天一個朋友 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

相關文章
相關標籤/搜索