34339


下記、std::vectorのbeginの定義ですが、タイトルの通り戻り値のみ違う、引数が同じ関数のオーバーロードをしていると思います。  
オーバーロードは普通引数が違う関数でないとエラーが出ると思うのですが、これはどういった仕組で定義されているのでしょうか。

[code]

    _LIBCPP_INLINE_VISIBILITY iterator               begin() _NOEXCEPT;
    _LIBCPP_INLINE_VISIBILITY const_iterator         begin()   const
    _NOEXCEPT;
    _LIBCPP_INLINE_VISIBILITY iterator               end() _NOEXCEPT;
    _LIBCPP_INLINE_VISIBILITY const_iterator         end()     const      _NOEXCEPT;
    
[/code]


CC BY-SA 3.0
2017-04-28T00:07:56.183
34337
2017-04-28T03:11:26.187
22827
question
c++
戻り値のみ違う関数のオーバーロードについて


JIS X 3014:2003 13.1 多重定義可能な宣言の２項  
\- 返却値の型だけが異なる関数宣言は、多重定義することができない  
\- 同じ名前及び同じ仮引数型をもつ複数のメンバ関数宣言であって [snip]  
暗黙のオブジェクト仮引数の型が異なれば、それらのメンバ関数宣言は、多重定義することができる

`vector::begin()` と `vector::begin() const` は暗黙の仮引数 `this` の constness が異なります。  
提示 `vector` [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") ソースを
[c](/questions/tagged/c "'c' のタグが付いた質問を表示") っぽく暗黙の `this` を明示するなら

[code]

    iterator vector_begin(vector* const this) { ... }
    const_iterator vector_begin(const vector* const this) { ... }
    
[/code]

となり、関数名は同じでも引数の型が異なるためオーバーロード可能です。


CC BY-SA 3.0
2017-04-28T00:49:49.970
34339
2017-04-28T03:11:26.187
2017-04-28T03:11:26.187
8589
8589
34337
answer