10

或多或少是标题所暗示的。虽然我还没有使用 C++0x,但我想为它发生时做好准备,并且我还想减少我必须重写以使用它的一些工具的代码量。这样我就可以一次性获得向后和向前的兼容性。

我发现的最有趣的一个是nullptr,我最近经常使用它。

在检查了“官方解决方法”和Meyer 的建议之后,我决定在我的 C++ 和未来的 C++0x 程序中都使用它。第二部分很简单——作为关键字,nullptr将被简单地支持。但第一部分让我有些不适。

Meyers 提案的功能如下:

class nullptr_t { // ← this is my issue
    // definition of nullptr_t
} nullptr = { };

该提议的问题在于它声明了要按照std::nullptr_tC++0x 要求声明的类型。这意味着要使解决方法“感觉原生”,必须通过重新打开std::命名空间来添加类型来完成。我有这样的理解,在 C++ 程序中这样做是非法的(不像添加专业化,这显然是皱眉和放手警告)。

我想在 C++ 程序nullptr中以舒适和合法的方式使用。我想到的一个选择是在另一个命名空间中声明类型,然后将其引入 using using

namespace mylibrary {
class nullptr_t {
    ....
} nullptr = { };
// end namespace
}

// These would have to go in the header file.
using mylibrary::nullptr;
using mylibrary::nullptr_t; // apparently this is necessary as well?

这是使它工作的正确方法吗?它将强制using指令,这也强制指令的特定顺序#include。我是否期望没有 C++0x 之前的代码会请求nullptr_t具有命名空间的类型(例如,作为函数参数类型)?如果这样做,它真的会“感觉像本地人”吗?


作为附录,尝试将一些漂亮的 C++0x 东西反向移植到 C++ 以获得更好的兼容性和编码是受欢迎的还是不受欢迎的?与此同时,我已经将这个解决方案和我正在开发的其他解决方案集成到一个要发布的软件中

4

2 回答 2

3

除非您能想到需要声明另一个类型对象的原因nullptr_t(我不能),否则我会将类型隐藏起来并放入nullptr全局命名空间以尽可能接近地模仿关键字:

namespace mylibrary
{
    class nullptr_t
    {
        ....
    };
}

mylibrary::nullptr_t nullptr = { };
于 2012-01-05T18:21:07.450 回答
1

不允许您添加内容的主要原因namespace std是,您不会弄乱已经存在的内容。否则,这很容易做到。我在过去发现的东西是对使用内置类型(如std::vector<int>. 但是,nullptr_t未在此命名空间中定义,添加 atypedef应该是无害的。也就是说,我将nullptr_t在不同的命名空间中定义namespace std,然后添加一个typedeffor nullptr_tto namespace std。无论如何,该变量nullptr都需要在全局范围内声明,因为它在 C++2011 中使用不合格。

是否需要该类型std::nullptr_t取决于您是否有兴趣使用该类型添加签名。例如,std::shared_ptr<T>可以与nullptr. 为此,有必要添加提及类型的合适重载std::nullptr_t(或为此类型使用其他名称)。

于 2012-01-05T20:01:16.197 回答