msvc140

时间:2016-09-16 21:16:36

标签: c++ generics lambda c++14

我不明白这段代码有什么问题吗?

#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

1 个答案:

答案 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扩展。