相关疑难解决方法(0)

"backporting"nullptr到C++ - 前C++ 0x程序

或多或少的标题暗示.虽然我还没有使用C++ 0x,但是我想在它发生时做好准备,而且我还想减少我必须重写的代码量才能使用它的一些功能.这样我就可以一次性地向前和向后兼容.

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

在检查了"官方解决方法"和Meyer的建议之后,我决定在我的C++和未来的C++ 0x程序中使用它.第二部分很简单 - 作为关键字,nullptr只需支持.但第一部分让我感到有些不适.

Meyers提案的功能如下:

class nullptr_t { // ? this is my issue
    // definition of nullptr_t
} nullptr = { };
Run Code Online (Sandbox Code Playgroud)

该提议的问题在于它声明了要声明为std::nullptr_tC++ 0x所需的类型.这意味着对于"感觉原生"的解决方法,必须通过重新打开std::命名空间来添加类型.我理解在C++程序中这是非法的(不像添加特殊化,这显然是皱眉和放开警告).

我想用nullptr在舒适在C++程序合法的方式.我想到的一个选项是在另一个命名空间中声明类型然后使用它using:

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

// These would have to go in the header file.
using mylibrary::nullptr;
using …
Run Code Online (Sandbox Code Playgroud)

c++ backport nullptr forward-compatibility c++03

9
推荐指数
1
解决办法
3834
查看次数

如何可靠地检测对nullptr的支持?

我需要将nullptr backport到我们拥有的跨平台库,但是我无法获得对nullptr支持的可靠检查.

最初我有这个:

#if __cplusplus >= 201103L || (__cplusplus < 200000 && __cplusplus >= 199711L)
    // nullptr should be ok
#else
    // Too old
#endif
Run Code Online (Sandbox Code Playgroud)

但后来我发现编译一个刚刚打印出__cplusplus值的程序会产生意想不到的结果.

一篇博客文章声称199711L是MS编译器用来表示对C++ 11的部分支持的值.但我注意到g ++ 5.4默认生成该值.直到你明确告诉它使用-std = c ++ 11编译.但是如果你告诉它标准是c ++ 98,那么仍然会显示199711的值.这对我来说听起来不对.所以这不是一个好检查!

然后我看到有人这样做的答案声称它可能有效.嗯,它没有.

#if !defined(nullptr)
#endif
Run Code Online (Sandbox Code Playgroud)

但我不确定你能做到这一点.所以我测试了这样:

#if defined(nullptr)
#error "null ptr defined"
#endif
Run Code Online (Sandbox Code Playgroud)

你猜怎么着?当nullptr实际可用时,它不会打印出错误.所以这根本不存在.

如何在linux/windows和OSX(clang)/ android下检测nullptr或编译器版本.

c++ c++11

8
推荐指数
1
解决办法
599
查看次数

标签 统计

c++ ×2

backport ×1

c++03 ×1

c++11 ×1

forward-compatibility ×1

nullptr ×1