使用Visual Studio(11月12日CTP)编译某些代码时出现此错误:
1>c:\users\*\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\main.cpp(19): error C2893: Failed to specialize function template 'unknown-type locked_call(Lockable &,Callable,Args &&...)'
1> With the following template arguments:
1> 'std::mutex'
1> 'main::<lambda_d4c412a6f5bd8d382f54c74dc3b1ff5d>'
1> ''
以下是我的功能的简短示例:
#include <mutex>
#include <utility>
template <class Lockable, class Callable, typename... Args>
auto locked_call(Lockable &mtx, Callable fn, Args &&... args)
-> decltype(fn(std::forward<Args>(args)...))
{
std::lock_guard<Lockable> hold(mtx);
return fn(std::forward<Args>(args)...);
}
int main()
{
std::mutex mtx;
locked_call(mtx, [&] {
});
}
所以我的问题是:为什么这不编译? VS11都支持尾随返回类型,可变参数模板和decltype,但编译器似乎无法获取函数调用的结果类型。