【发布时间】:2020-04-17 22:11:37
【问题描述】:
我遇到了一个问题。当我使用std::function<A(Fs...)> 之类的东西时,它不起作用,但std::function<A(Fs..., B)> 确实起作用。这是在 Clang 8.0 下;它在 GCC 下都不起作用。
示例如下:
#include <functional>
template<typename A, typename B, typename ...Fs>
void func_tmpl1(std::function<A(Fs..., B)> callable)
{
}
template<typename A, typename ...Fs>
void func_tmpl2(std::function<A(Fs...)> callable)
{
}
class Cls1{};
void func0(std::function<void(float, Cls1)> callable)
{
}
int main()
{
std::function<void(float, Cls1)> f1 = [](float a, Cls1 b){};
func0(f1);
func0([](float a, Cls1 b){});
func_tmpl1<void, Cls1, float>(f1); // fails in GCC
func_tmpl2<void, float, Cls1>(f1);
func_tmpl1<void, Cls1, float>( // fails in GCC
[](float a, Cls1 b)
{
}
);
func_tmpl2<void, float, Cls1>( // fails in both
[](float a, Cls1 b)
{}
);
return 0;
}
在Godbolt 上,我们可以看到 GCC 总是失败,但 Clang 只在最后一次函数调用时失败。谁能解释这里发生了什么?
【问题讨论】:
-
没有 Cls1 是 B,float 是 Fs。所以它是正确的,它在clang中编译得很好。
-
对不起,我看错了。
-
这在 MSVC 上编译和运行。
标签: c++ templates c++17 variadic-templates std-function