在Visual C++以前的版本中,可以将非常量引用绑定到临时对象。 现在,只能将临时对象绑定到常量引用。

    示例:
    例如,与Visual Studio .NET相比,以下示例在Visual Studio .NET 2003中具有不同的运行时行为:

        #include "iostream"
        using namespace std;
        class C {};

        void f(C & c) { cout << "C&" << endl; }
        void f(C const & c) { cout << "C const &" << endl; }

        int main()
        {
           f(C());
        }

    Visual Studio 6.0中的输出:
        C&
    Visual Studio .NET 2003中的输出:
        C const &   
 

    参见:Visual C++ 编译器中的重大更改
    附注:规定临时对象只能绑定到常量引用,表示不能通过该引用改变临时对象的值,但是临时对象本身并不是const型的,C() = C();是允许的~

    另外,经本人测试,在VS2003或者VS2005中,如果去掉上面的f(C const& c)函数,不会产生编译错误,main()函数会正常调用f(C &c)函数,而且C &c = C()也能够通过编译,而这些在g++中却会产生编译错误。这说明VC编译器对C++标准的支持还不是很完全,g++编译器对代码的要求更加严格。

    原文地址:http://msdn.microsoft.com/zh-cn/cfbk5ddc.aspx