• vs2010编译的程序无法在XP SP2以前的平台上运行,这是由于MS在处理(有可能有意)库函数的时候出现了问题,试过多种解决方案,最后还是得上汇编,把上面的代码保存成vs10port.asm加到项目中用masm编译然后生成的obj和主程序链在一起即可。

  •   卓越的网络硬盘以及文件同步服务提供商dropbox在2010年5月10日被伟大的GFW阻挡在国门之外。这是一个历史性的时刻。

      临时的解决方法是hosts文件中增加一行 174.36.30.71 www.dropbox.com

      估计很快也会被彻底封杀吧…… 唉!

  •  

    微软VS2010这广告一个比一个煽情……

    第一幕:做你的下一行Code

  •   之前我发的一篇翻译文中有说道右值引用能够绑定在左值或者右值上面,但不能绑定在常量的左右值上面。但是这种情况在最近的VC10版本中(RC版和正式版)中发生了改变:右值引用不可以绑定在左值上。

    #include <iostream>
    using namespace std;


    void fun(int&& value){
      cout << value << endl;
    }

    int main(){
      int a = 10;
      int b = 20;

      fun(a);        //错,左值引用绑定到右值上
      fun(a + b);
      fun(5);

      return 0;
    }

      上面的代码在VS2010 beta版本上运行是正常的,但如果在正式版中编译的话,会收到下面的错误消息:

      1>Main.cpp(13): error C2664: 'fun' : cannot convert parameter 1 from 'int' to 'int &&'
      1>          You cannot bind an lvalue to an rvalue reference

      VC10中禁止右值引用绑定在左值上是基于安全考虑的,详细的解释请参看标准委员会文档N2844 "Fixing a Safety Problem with Rvalue References"。简要的解释就是,比如上面的代码,函数fun()的参数value的类型不是int而是vector一类的容器,而fun()又没有参数是左值引用的重载,那如果调用fun(a),它可能会根据右值特性将a的内存偷窃,导致后面的代码出错。

      解决问题的方法就是禁止右值引用和左值绑定,如果程序员确信这样做是安全的,那么他可以显示的使用static_cast将左值变为右值,或者使用std::move():

    #include <iostream>
    #include <utility>
    using namespace std;

    void fun(int&& value){
      cout << value << endl;
    }

    int main(){
      int a = 10;
      int b = 20;

      fun( move(a) );    //正确
      fun( static_cast<int&&>(b) ); //正确
      fun(a + b);
      fun(5);

      return 0;
    }

      最后,由此更改引发的其它问题,比如说标准库的一坨更改,请参看文档N2844

  • 记诗两首 - [生活]

    Tag:

    言怀

    唐寅
    笑舞狂歌五十年,花中行乐月中眠。
    漫劳海内传名字,谁论腰间缺酒钱。
    诗赋自惭称作者,众人多道我神仙。
    些须做得工夫处,莫损心头一寸天。

    老黄牛

    臧克家
    块块荒田水和泥,深耕细作走东西。
    老牛亦解韶光贵,不等扬鞭自奋蹄。