Concepts is a facility for specifying requirements for template arguments.
It is an [ISO Technical Specification](#Ref-conceptsTS), but currently supported only by GCC.
It is an [ISO Technical Specification](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4553.pdf), but currently supported only by GCC.
Concepts are, however, crucial in the thinking about generic programming and the basis of much work on future C++ libraries
(standard and other).
@ -16885,7 +16885,7 @@ Flag template type arguments without concepts
##### Reason
"Standard" concepts (as provided by the [GSL](#S-GSL) and the [Ranges TS](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4569.pdf), and hopefully soon the ISO standard itself)
"Standard" concepts (as provided by the [GSL](#S-gsl) and the [Ranges TS](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4569.pdf), and hopefully soon the ISO standard itself)
save us the work of thinking up our own concepts, are better thought out than we can manage to do in a hurry, and improve interoperability.
##### Note
@ -17682,7 +17682,7 @@ Because that's the best we can do without direct concept support.
##### Note
Beware of [complementary constraints](# T.25).
Beware of [complementary constraints](#Rt-not).
Faking concept overloading using `enable_if` sometimes forces us to use that error-prone design technique.
##### Enforcement
@ -18031,7 +18031,7 @@ or a traditional traits template to be specialized on the user's type.
If you intend to call your own helper function `helper(t)` with a value `t` that depends on a template type parameter,
put it in a `::detail` namespace and qualify the call as `detail::helper(t);`.
An unqualified call becomes a customization point where any function `helper` in the namespace of `t`'s type can be invoked;
this can cause problems like [unintentionally invoking unconstrained function templates](#Rt-unconstrained-adl).
this can cause problems like [unintentionally invoking unconstrained function templates](#Rt-visible).
##### Enforcement
@ -20654,13 +20654,13 @@ Type safety profile summary:
* <aname="Pro-type-constcast"></a>Type.3: Don't use `const_cast` to cast away `const` (i.e., at all):
[Don't cast away const](#Res-casts-const).
* <aname="Pro-type-cstylecast"></a>Type.4: Don't use C-style `(T)expression` or functional `T(expression)` casts:
Prefer [construction](#Res-construct) or [named casts](#Res-cast-named).
Prefer [construction](#Res-construct) or [named casts](#Res-casts-named).
* <aname="Pro-type-init"></a>Type.5: Don't use a variable before it has been initialized:
[always initialize](#Res-always).
* <aname="Pro-type-memberinit"></a>Type.6: Always initialize a member variable:
[always initialize](#Res-always),
possibly using [default constructors](#Rc-default0) or
[default member initializers](#Rc-in-class-initializers).
[default member initializers](#Rc-in-class-initializer).