C++17 <functional> 模板参数推导在 Xcode 10.1 上不起作用

6

我一直在尝试使用C++17 (以及更新版本)中的模板参数推导,并尝试编译来自cppreference.com的这个示例:

#include <functional>

int func(double) { return 0; }
int main() {
  std::function f{func}; // guide #1 deduces function<int(double)>
  int i = 5;
  std::function g = [&](double) { return i; }; // guide #2 deduces function<int(double)>
}

在他们网页上的编译器中编译和运行正常,但是当我尝试在我的Macbook Pro上编译时失败了,显示错误:

error: no viable constructor or deduction guide for deduction of template arguments of 'function'

我已经在设置为C++17的Xcode(v10.1)项目中尝试过,并直接使用-std=c++17运行clang。

我还在不同的在线编译器上编译了上面的示例,例如这里:https://godbolt.org/z/ERliha

我也验证了std :: pair的类型推导是否有效,所以我不能确定:

  1. 当我搞交叉编译器时,是否弄错了我的工具链。
  2. Apple的工具链中是否缺少此类的推导向导。
  3. 我是否运行着旧版的工具链(我不知道如何检查)。
  4. ...(任何其他原因)

您可以使用 clang --version 命令来检查 Clang 的版本。 - chris
我运行了它并得到了以下结果: Apple LLVM版本10.0.0(clang-1000.11.45.5) 目标:x86_64-apple-darwin18.2.0 线程模型:posix 已安装目录:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin - David Zech
1个回答

4
看起来libc++还没有完全支持所有的模板参数推导,如果我们查看libc++状态页面,它说带来这个特定的模板参数推导的提案正在进行中:

P0433R2| LWG Toward a resolution of US7 and US14: Integrating template deduction for class templates into the standard library |Kona| 进行中

我们从这个godbolt会话中可以看到,使用-stdlib=libc++时clang会失败,但是使用-stdlib=libstdc++则不会。 针对模板参数推导的libc++提交没有任何关于std::function的提交。

现在我们针对这个Bug 39606: std::function does not have deduction guides有一个错误报告。


不错的发现。看起来苹果只为Xcode项目提供了一个旧版本的libstdc++,所以我运气不佳。 - David Zech
2
Xcode实际上使用的是相当新的libc++,但是libc++(即使是当前的主干)也不支持此功能。请参见https://bugs.llvm.org/show_bug.cgi?id=39606。 - Louis Dionne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接