首页 > C/C++开发工具专区 > VC技术 > VC2005 Bug汇总[转]
2007
01-08

VC2005 Bug汇总[转]


VC++2005虽然比不上g++,但也差强人意,可以用于工作和学习,因此我把已经发现的bug汇总起来(以前发表过的bugs不再重复汇总),以便工作时避开这些bug。

1.
#include <iostream>
using namespace std;


void foo( char* )
{
    cout << “foo( char* )” << endl;
}
void foo( const char* )
{
    cout << “foo( const char* )” << endl;
}


int main()
{
    foo( “abc” );


    try {
        throw “abc”;
    }
    catch( char* ) {
        cout << “catch( char* )” << endl;
    }
    catch( const char* ) {
        cout << “catch( const char* )” << endl;
    }
}
输出为
foo( const char* )
catch( char* )
应当为
foo( const char* )
catch( const char* )


2.
#include <set>
using namespace std;


int main()
{
    set<int> a;
    a.insert( 1 );
    *a.begin() = 2;  // set键应当不可以修改
   
    system( “pause” );
}


3.
#include <iostream>
using namespace std;


template<typename T> struct foo
{
    void bar( int a = 1 );
};
template<typename T> void foo<T>::bar( int a = 2 ) // 应当不可以重复定义缺省值
{
    cout << a << endl;
}


int main()
{
    foo<int> a;
    a.bar();
}

4.
union foo
{
    static const int a = 2; // 理应不可以
};

5.
template<class T> struct foo
{
     T a;
     typedef float T; // 掩盖了模板参数
     T b;
};

6.
#include<string>
using namespace std;
string foo( void )
{
    return “123″;
}
void bar( string& s )
{
    s = “abc”;
}
int main()
{
    foo()[0] = ‘X’;       // 提醒一下,虽然foo()为temporary变量,但其不是const变量,所以仍可调用non-const成员函数


    bar( foo() );         // vc++2005编译通过;g++报错:无法将临时变量转化为non-const引用
    bar( string(“ABC”) ); // vc++2005编译通过;g++报错:无法将临时变量转化为non-const引用
    bar( “ABC” );         // 两者都报错
}

7.
#include <iostream>
#include <string>
#include <sstream>
using namespace std;


void foo() {
    cout << “right” << endl; // 输出这个则代表正确
}


template<typename T> struct B {
    void foo() {
        cout << “wrong” << endl; // 输出这个则代表错误
    }
};


template<typename T> struct D: B<T> {
    void bar() {
        foo();
    }
};


int main() {
    D<int> d;
    d.bar();
}


8. 一个无伤大雅的小bug
struct foo
{
    virtual void bar() = 0 {}
};
应当不可以编译通过,正确的应当写成
struct foo
{
    virtual void bar() = 0;
};
void foo::bar() {}
因为 ISO/IEC 14882:2003(E) 10.4.2 说:
[Note: a function declaration cannot provide both a pure-specifier and a definition
—end note]
[Example:
struct C {
virtual void f() = 0 { }; // ill-formed
};
—end example]

此列表随时增加中,欢迎提供bug。


引用:http://blog.vckbase.com/bruceteen/archive/2006/05/30/20366.html


留下一个回复