2014-09-05 102 views
7

實施nullptr我嘗試的正式實施nullptr故障在VS2013

我知道有nullptr和std :: nullptr_t由編譯器的支持,這種實現是meaningless.I我只是想學習C++。

在我的電腦上,GCC4.9.1支持-std = C++ 03和-std = C++ 11,即使成功的Online @ ideone.com GCC4.3.2也能正常工作。

但在VS2013線125變error2440,轉換失敗

error C2440: "initialize": cannot convert "const <unnamed-type-my_nullptr>" to "int (__thiscall Test::*)(void) const" in line125 

>

#include <iostream> 
#include <cassert> 

// The Official proposal 
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf 
const // this is a const object... 
class { 
public: 
    template<class T> // convertible to any type 
    operator T*() const // of null non-member 
    { 
     return 0; 
    } // pointer... 

    template<class C, class T> // or any type of null 
    operator T C::*() const // member pointer... 
    { 
     return 0; 
    } 

private: 
    void operator&() const; // whose address can't be taken 
} my_nullptr = {}; // and whose name is nullptr 


struct Test123 { 
    int ABCD, ABC, AB; 
    int A; 
    int BA, CBA, DCBA; 
    struct XYZ { 
     char X, Y, Z, W; 
    }; 
    struct { 
     int B, C, D; 
    }; 
} test123; 


class Test { 
    int ABCD; 
public: 
    void method(void){} 

    Test(int val) :ABCD(val){} 
    int getABCD(void) const { return ABCD; } 
    int get2ABCD(void) const { return ABCD * 2; } 
    int get3ABCD(void) const { return ABCD * 3; } 
} test(0123); 


int main(int argc, char* argv[]) 
{ 

    // TEST_my_nullptr 
    { 
     int a = 321, *p = my_nullptr; 
     assert(p == my_nullptr); 
     assert(my_nullptr == p); 

     p = &a; *p = 0123; 
     assert(p != my_nullptr); 
     assert(my_nullptr != p); 

     p = my_nullptr; 

     int(*mainptr)(int argc, char** argv) = my_nullptr; 
     assert(mainptr == my_nullptr); 
     assert(my_nullptr == mainptr); 
    } 


    // TEST_my_nullptr_const 
    { 
     const int a = 321, *p = my_nullptr; 
     assert(p == my_nullptr); 
     assert(my_nullptr == p); 

     p = &a; 
     assert(p != my_nullptr); 
     assert(my_nullptr != p); 

     const int** ptr = my_nullptr; 

     assert(ptr == my_nullptr); 
     assert(my_nullptr == ptr); 

     ptr = &p; 
     assert(ptr != my_nullptr); 
     assert(my_nullptr != ptr); 
     assert(*ptr != my_nullptr); 
     assert(my_nullptr != *ptr); 

    } 


    // TEST_my_nullptr_member 
    { 
     int Test123::*pINT = my_nullptr; 
     assert(pINT == my_nullptr); 
     assert(my_nullptr == pINT); 

     pINT = &Test123::ABCD; 
     assert(pINT != my_nullptr); 
     assert(my_nullptr != pINT); 

     test123.*pINT = 0123; 

     const int Test123::*pCINT = my_nullptr; 
     assert(pCINT == my_nullptr); 
     assert(my_nullptr == pCINT); 

     pCINT = &Test123::ABCD; 
     assert(pCINT != my_nullptr); 
     assert(my_nullptr != pCINT); 

     assert(test123.*pCINT == test123.*pINT); 
    } 

    // TEST_my_nullptr_Function 
    { 
     void (Test::*pm)(void) = &Test::method; 

     pm = my_nullptr; 

     > int (Test::*pABCD)(void) const = my_nullptr; // This Fxxk Line In VS2013 

     pABCD = &Test::getABCD; 

     int a1 = (test.*pABCD)(); 

     pABCD = &Test::get2ABCD; 
     int a2 = (test.*pABCD)(); 

     pABCD = &Test::get3ABCD; 
     int a3 = (test.*pABCD)(); 

     assert(a1 + a2 == a3); 
    } 

    std::cout << "All Tests for my_nullptr Passed!" << std::endl; 
    return 0; 
} 

my Testsuit in GCC4.3.2

+5

明確顯示在該行出現錯誤,並顯示完整的錯誤消息。 – Jarod42 2014-09-05 09:48:38

+1

您的代碼中有一個匿名結構。 – 2014-09-05 10:30:53

+1

看起來是'pABCD'變量的'const'上的MS錯誤。也許在http://connect.microsoft.com上提交錯誤報告? – Niall 2014-09-05 11:08:06

回答

1

這可能是在VS2013中的錯誤。該錯誤似乎已經在VS14 CTP中得到修復,然而,您的代碼無錯地編譯。

0

這是可悲的,甚至沒有錯誤的行爲。因爲MS的編譯器並不是最快的,它也不是對標準的解釋,所以它們幾乎從不接近它。

即MSVC2013純C編譯器是C89和C99子句的混合體,有許多額外的異常,因爲不支持標準說交流編譯器支持的東西,並且還有很多功能,標準說交流編譯器不允許有。

因此,在使用Microsoft Visual C編譯器編譯c或C++應用程序時,不要依賴標準。

(那可能就是爲什麼他們稱之爲的Visual C,因爲他們甚至不會被允許把它叫做純C;))