在实现nullptr时遇到了麻烦(针对VS2013)

7

我尝试使用nullptr的官方实现。

我知道,由于编译器支持nullptr和std::nullptr_t,此实现毫无意义。我只是在学习C++。

在我的电脑上,使用GCC4.9.1编译时,包括-std=c++03和-std=c++11,甚至在线IDE ideone.com上使用GCC4.3.2也可以成功编译。

但是,在VS2013中,第125行出现错误2440,转换失败。

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;
}

我的GCC4.3.2测试套件


5
请明确显示出现错误的行数并展示完整的错误信息。 - Jarod42
1
你的代码中有一个匿名结构体。 - user3920237
1
似乎是pABCD变量的const存在MS错误。也许可以在http://connect.microsoft.com上提交错误报告? - Niall
2个回答

1
这可能是VS2013中的一个错误。然而,在VS14 CTP中似乎已经修复了此错误,您的代码可以编译而无错误。

0

这很遗憾,行为甚至不正确。

由于微软的编译器不是最快的,并且它也不符合标准的解释,因此它们几乎从来都不接近标准。

例如,MSVC2013纯C编译器是c89和c99条款的混合体,具有许多额外的例外情况,如不支持标准规定的一些c编译器必须支持的内容,并且还具有许多标准规定的c编译器不允许拥有的功能。

因此,在使用Microsoft Visual C编译器编译c或c++应用程序时,请不要依赖标准。

(这可能就是为什么他们称其为Visual C,因为他们甚至不能称其为纯C ;))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接