Wrap pattern "using std::begin; return begin(c);" into a function
namespace Dlugosz::d3 {
  inline namespace twostep_wrapper {
    using std::begin;
    using std::end;

    inline namespace twostep_inner {
      inline auto Begin = [](auto&amp;&amp; r)
      //...


The use of inline namespaces seems inappropriate.  Did you intend for the content of your inline namespaces to percolate up to d3 and pollute it?  The user essentially gets access to 


d3::begin(), (intended?)
d3::Begin(), (intended?)
d3::twostep_wrapper::begin(), (user shouldn't call this)
d3::twostep_wrapper::Begin(), (user shouldn't call this)
d3::twostep_wrapper::twostep_inner::Begin(), (user shouldn't call this)
d3::twostep::Begin(), (intended!)


as well as the end()/End() versions.



inline auto Begin = [](auto&amp;&amp; r) 
-&gt; decltype(begin(std::forward&lt;decltype(r)&gt;(r)))
{
    return begin(std::forward&lt;decltype(r)&gt;(r));
};


C++17 provides constexpr lambdas.  While lambdas may evaluate in a constexpr context implicitly, consider being explicit.

Consider inheriting the noexcept specification from the function that is selected in overload resolution.

inline constexpr auto Begin = [](auto&amp;&amp; r) 
noexcept(noexcept(begin(std::forward&lt;decltype(r)&gt;(r))))
-&gt; decltype(begin(std::forward&lt;decltype(r)&gt;(r)))
{
    return begin(std::forward&lt;decltype(r)&gt;(r));
};




You listed Niebler's blog post, but he also has a proposal you may want to check out.