For C++17, it has a small change with proposal p0184r0,which make it possible to specify different begin() and end() type for a user-defined type, to compatible with range-based