如何在 Xcode 中获得 std::optional 支持?

Posted

技术标签:

【中文标题】如何在 Xcode 中获得 std::optional 支持?【英文标题】:How to get std::optional support in Xcode? 【发布时间】:2021-01-06 16:38:06 【问题描述】:

我正在尝试在 Xcode 12.0 Mac OS 项目中使用 std::optional。我收到错误: 命名空间“std”中没有名为“可选”的模板

#include <optional>

std::optional<int> o;

我的设置是(我的项目需要 libc++):

【问题讨论】:

这很奇怪;我没有安装 Xcode 12,但我有适用于 Catalina 的苹果命令行工具(Apple clang 版本 11.0.3 (clang-1103.0.32.62)),并且您的代码编译时没有错误。 clang++ -std=c++17 -c so.cpp 在 Xcode11 中添加了 &lt;optional&gt; 标头。见release notes 您是否查看过构建日志——特别是传递给编译器的命令?我知道您的屏幕截图显示您选择了 C++17;你能验证它是否被传递给编译器吗?另外,您是否从上面尝试过我的命令行? @MarshallClow 感谢您的意见。我正在从模板项目构建一个插件,经过更仔细的检查后,我注意到并删除了“其他 C++ 标志”下的“-std=gnu++11”。 【参考方案1】:

Apple 作为 Xcode 12(和 11)的一部分提供的 libc++ 版本包括对许多 C++17 功能的支持,包括 optional。请参阅 Xcode 11 release notes。

Xcode 中表示 libc++“支持 C++11”的文本与 Apple 过去发布的不支持 C++11 的标准库 (libstdc++ v 4.2.1) 形成对比。不代表只支持C++11,不支持C++14/17/20/等。

OP 在评论中提到他在“其他标志”中有一个 -std=gnu++11 导致问题。

【讨论】:

【参考方案2】:

std::optional 类型是 C++17 特性。尽管您在设置中使用 C++17 进行编译,但请仔细查看标准库版本。它声明您使用的版本仅支持 C++11。

升级您的库以使用std::optional

您也可以尝试#include &lt;experimental/optional&gt;,看看您的图书馆是否有std::experimental::optional可用。

【讨论】:

这不是真的; Apple 发布的 libc++ 支持 C++11 以外的许多东西 @MarshallClow 看截图。它的字面意思是“支持 C++11 的 LLVM C++ 标准库”。我毫不怀疑有一个支持 C++17 的 libc++ 版本。但是 OP 使用的那个似乎不是。 libc++ 项目(早在 2010 年)开始提供标准库实现以支持 C++11 - 而不是 libstdc++ 4.2.1(这是苹果当时发布的,它不支持 C++11)。我相信这就是文本的来源。无论如何,我向您保证,Apple 不会(今天或自 2015 年左右之后的任何时间)发布仅限 C++11 的标准库实现。 @MarshallClow 好的,我愿意相信你的保证。鉴于 OP 提供的信息,它看起来就像是一个过时的图书馆应该受到指责。到目前为止,我还没有更好的理论 --- 而且我没有苹果来测试它。 @bitmask 不在 Xcode 12 版本中。也是标准库版本,虽然名称上写着“c++ 11 support”,但据称它已更新为支持 C++17。 developer.apple.com/forums/thread/114246。 Xcode 12 是最新的 Xcode。

以上是关于如何在 Xcode 中获得 std::optional 支持?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xcode UI 测试中获得授权部分

如何获得 Xcode 8 的 clang 格式?

如何获得Xcode 8的clang格式?

如何获得 Xcode 项目的“二进制”?

在 iPhone X 屏幕底部获得空白(Xcode 9)

我在哪里可以获得 Mac OS X 旧的 SDK?