如何使用C ++测试功能支持?

时间:2017-01-10 01:06:21

标签: c++ g++ optional c++17

我正在尝试将::std::optional<T>与g ++ 6.3.1和-std = c ++ 17标志一起使用。事实证明,我必须实际#include <experimental/optional>并使用::std::experimental::optional<T>代替。如何对此进行测试,以便在功能真正包含在标准库中后,我可以包含正确的标题?

是否有一个选项我可以给g ++所以它包含'实验'功能,好像它们是标准的?

2 个答案:

答案 0 :(得分:3)

您可以使用feature testing recommendations中的__cpp_lib_experimental_optional

答案 1 :(得分:0)

简而言之,这里的故事是,gcc习惯成为各种各样的“早期采用者”,这些内容被提议包含在即将推出的C ++标准版本中,但在这些版本被正式采用之前。 / p>

当然,无法保证gcc中这些位的实现最终会在最终的C ++标准中完成,而不会进行任何后续调整。因此,在这种情况下,它们会被释放为<experimental/optional>而不是<optional>

您可以预期此头文件将在<optional>的未来版本中重命名为gcc,可能需要进行任何最终调整才能使其与C ++标准中的最终规范相匹配。

将你自己的头文件和翻译单元编写到#include <experimental/optional>而不是#include <optional>应该没问题。没有编译器开关可以为您执行此操作。当您将编译器升级到更新的版本(实现最终的C ++标准规范)并且具有实际的<optional>头文件时,您可以相应地更新源代码。

您还可以在源树中放置一个名为optional的存根文件,其中只包含:

#include <experimental/optional>

然后添加-I .编译选项,以便#include <...>也查看当前目录;然后参考来源中的#include <optional>

-I .会找到此存根,它会引入experimental/optional。稍后更新gcc时,您只需删除此文件和-I .选项即可。

More information