Вот, например, я пишу враппер сильной типизации над типом, который в точности сохраняет семантику подкапотного типа. Скажем, это strong<int>. А теперь я хочу запретить operator= для всего, что приводит к narrowing-преобразованию (например strong<int> i; i = 42.0;). Это должно быть sfinae или static_assert? Что должен сказать std::is_assignable<strong<int>, double>?
enable_if должен быть, потому что в противном случае у вас будет operator < из std::vector который в другом sfinae коде проверить не получится
грубо говоря вот у меня получается, что static_assert это как если бы в обычном коде вы хотели бросать исключение, а enable_if как если бы в обычном коде вы хотели указать типизированный параметр (что и делается в С++20, комната ожидания концептов)
Обсуждают сегодня