【问题标题】:Compiler which can compile c++17 lambda inheritance with parameter pack可以使用参数包编译 c++17 lambda 继承的编译器
【发布时间】:2016-12-05 21:08:01
【问题描述】:

我读到了using function declaration,我想编译最后一个例子。这是:

#include <iostream>
template <typename... Ts>
struct Overloader : Ts... {
    using Ts::operator()...; // exposes operator() from every base
};

template <typename... T>
constexpr auto make_overloader(T&&... t) {
    return Overloader<T...>{std::forward<T>(t)...};
}

int main() {
    auto o = make_overloader([] (auto const& a) {std::cout << a;},
                             [] (float f) {std::cout << 13 << f;});
}

即使我已经知道并理解它会做什么,我还是想编译和测试它。 但是,clang-4.0 和 g++-7.0 目前似乎都无法编译它。有什么地方可以用任何编译器试试吗?

【问题讨论】:

  • 如果最新版本的 GCC 和 Clang 都不能做某事,那么几乎可以保证其他编译器也不能做(模数错误)。除非它是某个独立项目,否则可能是其中一个的分支。
  • 这个功能在大约一个月前被投票纳入工作草案。实施需要时间。
  • @TC:即使声明符列表功能获得批准,我仍然不明白 OP 的示例将如何编译。 Overloader 不是聚合,因为它有一个基类。此外,make_overloader 正在接收通用 lambda,那么 Overloader 是否也被适当地模板化以处理它?你能帮帮我吗?
  • @AndyG 我认为 C++17 中基类发生了聚合初始化变化?就像,他们每个人都在{} 列表中获得一个“插槽”?我不记得了,而且对 C++17 的玩得还不够,没有很好的直觉。除了缺少std::decay 之外,我认为make_overloader 没有问题:尤其是Overloader&lt;std::decay_t&lt;T&gt;...&gt;
  • @AndyG 在 C++17 中,聚合可以有公共基础。如果您正在测试最前沿的东西,我建议您使用 Wandbox(它是从树干构建的)而不是 Coliru。 (顺便说一句,这没有 ping 通。)

标签: c++ c++17


【解决方案1】:

P0195,建议的语言扩展允许:

template <typename... Ts>
struct Overloader : Ts... {
    using Ts::operator()...; // <== ill-formed without p0195
};

几周前(2016 年 11 月)在 Issaquah 才被 C++ 接受。 gcc 或 clang 还没有实现它并不奇怪。给他们时间。

目前的解决方法是为Overloader 创建一个线性层次结构。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多