Более простой способ написать это - использовать временный объект:
return std::hash<uint64_t>{}(my_val_);
Он делает то же самое, что и ваш второй подход.
Я не могу точно сказать, что _Do_hash
делает, но в любом случае это нестандартное и не должно использоваться, чтобы избежать проблем с переносимостью.
Поскольку поиск в Google не обнаружил никакой документации по функции, я бы предположил, что это подробности реализации стандартной реализации библиотеки, которую вы используете и которая не предназначена для использования пользовательским кодом. Поэтому вам не следует использовать его вообще, даже если вас не волнует переносимость.
Также обратите внимание, что для производительности не имеет значения, используете ли вы свой подход с именованной переменной или мой подход, использующий временный характер. Компилятор почти наверняка сгенерирует из него идентичный код. Какой вы используете, это вопрос стиля кода.