为什么在此示例中模板参数的顺序对MS C++编译器很重要?

Sar*_*ien 28 c++ templates visual-c++ c++11

以下代码在GCC中编译良好,但在Visual Studio中导致

错误C2782:' bool contains(const T &,const std::initializer_list<T2> &)':模板参数' T'含糊不清,请参阅' contains'可能const wchar_t *'或' std::wstring'的声明

但是,如果给出模板参数的顺序,它确实可以编译和工作

template<typename T2, typename T>

这是编译器错误吗?

#include <string>
#include <iostream>
#include <set>
#include <initializer_list>
#include <algorithm>

template<typename T, typename T2>
bool contains(T const& value, std::initializer_list<T2> const& set)
{
  return std::find(std::begin(set), std::end(set), value) != std::end(set);
}

int main(void)
{
  std::set<std::wstring> values = { L"bar", L"not" };

  for (std::wstring val : values) {
    std::wcout << "\"" << val << "\" ";
    if (contains(val, { L"foo", L"bar", L"baz", L"doom" })) {
      std::wcout << "found" << std::endl;
    }
    else {
      std::wcout << "not found" << std::endl;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:我创建了一个bug报告:https://connect.microsoft.com/VisualStudio/feedbackdetail/view/982338/template-parameter-order-matters

Jar*_*ubb 1

我记得VS有一个bug,他们会在某些情况下进行双重扣除,我认为这就是这里发生的情况。Clang 也以两种方式编译它,所以既然 clang + gcc 同意,这可能是 VS 的错误。