我不明白这段代码有什么问题吗?
#include <iostream>
#include <string>
#include <type_traits>
bool condition_func(int x)
{
return x > 0;
}
std::string true_branch_func(int x)
{
return "true_branch_func(int x), x = " + std::to_string( x );
}
std::string false_branch_func(int x)
{
return "false_branch_func(int x), x = " + std::to_string(x);
}
// template<typename C, typename T, typename F>
auto make_cond_functor(auto && cond, auto && true_f, auto && false_f)
{
return [&](auto &&... args)
{
return cond(args...) ? true_f(args...) : false_f(args...);
};
}
int main()
{
std::cout << make_cond_functor(condition_func, true_branch_func, false_branch_func)(-3) << std::endl;
return 0;
}
在Visual Studio 2015(msvc140)中,我遇到了问题:
错误C3533:参数不能包含&#39; auto&#39;
错误C2664:&#39; make_cond_functor :: make_cond_functor(int&amp;&amp;,int&amp;&amp;,int&amp;&amp;&amp;)&#39;:无法从&#39; bool转换参数1(__ cdecl *)(INT)&#39;到&#39; int&amp;&amp;&#39;
注意:原因:无法转换为超载功能&#39;到&#39; int&#39;
注意:没有可以进行此转换的上下文
但是g ++ - 6.2非常好地编译了这段代码。 make_cond_functor返回c ++ 14中允许的通用lambda。所以这段代码应该是正确的,不应该吗?并且msvc140存在问题,而不是代码,对吧?
cppreference上的通用lambda:enter link description here
答案 0 :(得分:1)
MSVC在这种情况下没有错(令人惊讶)。
问题是函数make_cond_functor
auto make_cond_functor(auto && cond, auto && true_f, auto && false_f)
// /\ /\ /\
// NOT VALID C++ SYNTAX
此功能签名无效。在当前的C ++中,唯一可以将auto
与函数参数一起使用的情况是泛型lambda。这似乎是GCC 4.9.0中引入的GCC扩展。