Подтвердить что ты не робот

Почему в этом примере порядок параметров шаблона имеет значение для компилятора MS С++?

Следующий код компилируется в 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;
    }
  }
}

Изменить: я создал bugreport: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/982338/template-parameter-order-matters

4b9b3361

Ответ 1

Я помню, что у VS есть ошибка, в которой они будут делать двойную дедукцию в определенных сценариях, и я думаю, что здесь происходит. Clang также скомпилирует его в обоих направлениях, так как clang + gcc согласен, вероятно, это ошибка VS.

Ответ 2

У меня была аналогичная проблема, которая была решена путем перехода на последнюю версию VS Pro. Я думаю, что эта ошибка была рассмотрена в последней версии VS pro, так как я помню, что в какой-то момент я видел ее в журнале изменений.