【发布时间】: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<std::decay_t<T>...> -
@AndyG 在 C++17 中,聚合可以有公共基础。如果您正在测试最前沿的东西,我建议您使用 Wandbox(它是从树干构建的)而不是 Coliru。 (顺便说一句,这没有 ping 通。)