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