https://ezoeryou.github.io/cpp-intro/#%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AE%E5%9F%BA%E7%A4%8E

「std::end(v)はvectorの変数vの最後の次の要素を指し示すイテレーターを取得する。
最後の次の要素を指し示すイテレーターに対して、*で要素にアクセスを試みるとエラーになる。
int main()
{
 std::vector<int> v = {1,2,3,4,5} ;
 auto i = std::end(v) ;
 *i ; // エラー
}

と書かれているのですが、そもそもコンパイル時エラー? ランタイムエラー?
C++はrange checkしないはずですが、本当にエラーになるとしたらどういう仕組みですか?