我正在尝试将::std::optional<T>
与g ++ 6.3.1和-std = c ++ 17标志一起使用。事实证明,我必须实际#include <experimental/optional>
并使用::std::experimental::optional<T>
代替。如何对此进行测试,以便在功能真正包含在标准库中后,我可以包含正确的标题?
是否有一个选项我可以给g ++所以它包含'实验'功能,好像它们是标准的?
答案 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 .
选项即可。