实现安全nullptr

Gam*_*per 6 c++ overriding final nullptr c++11

我想保持我的代码可以在遗留C++(使用"NULL"的C++代码)和新的C++ 11标准(使用"nullptr"的C++代码)上编译

我正在使用GCC,但是当我完成最重要的事情时,我还计划为VS重新编译整个代码库.

我是否应该期待GCC和VS都会这样做

#define NULL nullptr
Run Code Online (Sandbox Code Playgroud)

或者我自己会做得更好(当然使用不同的名称,其中MY_LIB将被我的库后缀替换)?

#ifndef nullptr
    #define MY_LIB_NULL NULL
#else
    #define MY_LIB_NULL nullptr
#endif
Run Code Online (Sandbox Code Playgroud)

我想要实现的是编译的代码,无论C++ 11的功能是否已经实现(并且因为我没有使用模板,所以它们很少).

例如,关键字"覆盖"和"最终"已经完成.

MY_LIB_OVERRIDE //macro, defines to "override" if c++11 is present.
MY_LIB_FINAL    //macro, defines to "final" if c++11 is present.
Run Code Online (Sandbox Code Playgroud)

我问这个问题是因为我知道"nullptr"问题有点奇怪,所以也许只是我已经为覆盖和最终做了同样的事情,这是错误的.需要对此提出意见.任何帮助都很好.

Mor*_*enn 4

您可能可以通过以下方式创建“false”my_nullptr类型:my_nullptr_t

const class my_nullptr_t
{
    public:

        /* Return 0 for any class pointer */
        template<typename T>
        operator T*() const
        {
            return 0;
        }

        /* Return 0 for any member pointer */
        template<typename T, typename U>
        operator T U::*() const
        {
            return 0;
        }

        /* Safe boolean conversion */
        operator void*() const
        {
            return 0;
        }

    private:

        /* Not allowed to get the address */
        void operator&() const;

} my_nullptr = {};
Run Code Online (Sandbox Code Playgroud)

这适用于 C++03 和 C++11,并且无论实现哪种 C++11 功能,都应该始终是安全的。该解决方案实际上已经在本主题nullptr_t中讨论过,该主题提出了基于官方提案的版本。