gcc 4.7.3 的一个 c++11 bug

请关注我们的技术创业项目 Terark,领先的数据技术提供商


昨天一个朋友 checkout 了我的 febird 代码,编译时出现了一个诡异的错误。经过仔细勘察,他的 g++ 版本是 4.7.3,而我测试过的 g++4.7.2,g++4.8.2均无问题。

后来修改代码,解决了那个问题,但要还原那个bug时,很费了一番力气。以下是还原的那个 bug 的一段简单代码,不过可能不是最简单的。


#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++ 标准。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值