Я часто использую технику, которую я называю "ленивый человек enable_if
", где я использую decltype
и оператор запятой, чтобы включить функцию, основанную на некотором вводе шаблона. Вот небольшой пример:
template <typename F>
auto foo(F&& f) -> decltype(f(0), void())
{
std::cout << "1" << std::endl;
}
template <typename F>
auto foo(F&& f) -> decltype(f(0, 1), void())
{
std::cout << "2" << std::endl;
}
С --std=c++11
, g++ 4.7+ и Clang 3.5+ счастливо скомпилируют этот бит кода (и он работает так, как я ожидал). Однако при использовании MSVC 14 CTP5, я получаю эту ошибку с жалобой foo
, которая уже определена:
Ошибка ошибки C2995: "шаблон foo (F &)" неизвестного типа ": уже определен С++ - scratch main.cpp 15
Итак, мой вопрос: является ли "ленивый человек enable_if
" легальным С++ или это ошибка MSVC?