diff --git a/src/TNL/Math.h b/src/TNL/Math.h
index 0a40b248df9906936f86b9eb77339ddecfaeeb5a..1f754bcecaa88ffc973387b56aa9d692aaca344c 100644
--- a/src/TNL/Math.h
+++ b/src/TNL/Math.h
@@ -27,12 +27,17 @@ template< typename T1, typename T2, typename ResultType = typename std::common_t
 __cuda_callable__ inline
 ResultType min( const T1& a, const T2& b )
 {
-#if defined(__CUDA_ARCH__)
+#if __cplusplus >= 201402L
+   // std::min is constexpr since C++14 so it can be reused directly
+   return std::min( (ResultType) a, (ResultType) b );
+#else
+ #if defined(__CUDA_ARCH__)
    return ::min( (ResultType) a, (ResultType) b );
-#elif defined(__MIC__)
+ #elif defined(__MIC__)
    return a < b ? a : b;
-#else
+ #else
    return std::min( (ResultType) a, (ResultType) b );
+ #endif
 #endif
 }
 
@@ -46,12 +51,17 @@ template< typename T1, typename T2, typename ResultType = typename std::common_t
 __cuda_callable__
 ResultType max( const T1& a, const T2& b )
 {
-#if defined(__CUDA_ARCH__)
+#if __cplusplus >= 201402L
+   // std::max is constexpr since C++14 so it can be reused directly
+   return std::max( (ResultType) a, (ResultType) b );
+#else
+ #if defined(__CUDA_ARCH__)
    return ::max( (ResultType) a, (ResultType) b );
-#elif defined(__MIC__)
+ #elif defined(__MIC__)
    return a > b ? a : b;
-#else
+ #else
    return std::max( (ResultType) a, (ResultType) b );
+ #endif
 #endif
 }