如何在 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 中添加了 <optional>
标头。见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 <experimental/optional>
,看看您的图书馆是否有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 中获得 std::optional 支持?的主要内容,如果未能解决你的问题,请参考以下文章