[c++] Является ли «lazy man's enable_if» законным C ++?



0 Answers

Это функция, называемая «выражение SFINAE». Он еще не полностью поддерживается Visual C ++ (см. «Возможности C ++ 11/14/17 в предварительном просмотре VS 2015» для последнего обновления соответствия на момент ответа).

Question

Я часто использую метод, который я называю «lazy man's 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 &&)»: шаблон функции уже определен c ++ - scratch main.cpp 15

Поэтому мой вопрос: является ли «lazy man's enable_if » законным C ++ или это ошибка MSVC?




Related