Insttiating dummy
будет использовать std::declval<T>
, что не разрешено стандартом.
Обратите внимание, что это не ошибка компиляции - просто опустить оператор return. Это просто приводит к UB, если вызывается dummy
. Поскольку вы уверены, что dummy
никогда не будет вызван, это не должно создавать для вас никаких проблем.
Однако, возможно, вам следует избегать, чтобы компилятор выдавал предупреждение о том, что элемент управления достигает конца функции, не являющейся void. В конце концов, в не отладочной сборке конец функции будет достигнут , если вам случится вызвать dummy
, поскольку assert
исчезнет. В этом случае я бы предложил поставить после assert
:
throw std::logic_error("dummy should not be called");
Теперь компилятор должен видеть, что функция не может достичь конца своего тела, не возвращая значение, поскольку она вообще не может достичь конца.
Это также повышает вероятность того, что программа действительно будет аварийно завершена, если dummy
действительно будет вызван каким-либо образом, а не вызывать UB.