55474


例えば以下のようなコードです

[code]

    class hoge{
        std::vector<int> val;
        hoge(std::vector<int> val) : hoge(std::move(val)){}
        hoge(std::vector<int> && val) : val(std::move(val)){/* 処理 */}
    };
    
[/code]

以上のコードをgcc(g++ -std=c++17)でコンパイルした所エラーとなりました。  
このような関数はオーバーロード解決できないのでしょうか？

また、余談ではありますが、代替として以下のような実装を考えています。  
このような実装を代替として用いるのは正しいでしょうか？

[code]

    class hoge{
        std::vector<int> val;
        hoge(const std::vector<int> & val) : hoge(std::move(std::vector(val))){}
        hoge(std::vector<int> && val) : val(std::move(val)){/* 処理 */}
    };
    
[/code]


CC BY-SA 4.0
2019-06-02T14:02:20.373
55457
2019-06-03T13:14:14.797
34557
question
c++
C++のオーバーロード解決について質問です。左辺値と右辺値参照の差のみしか存在しない関数は区別されませんか？


自己解決しました。そもそも右辺値参照を受け取るコンストラクタに一時的なオブジェクトを渡すこと自体が異常だったことを失念しておりました。  
また、左辺値と右辺値参照の関数が宣言されている場合、一時オブジェクトの解決等で曖昧さが出てしまう点に気が付いていませんでした。  
以下のような実装で運用を行いたいと思います。

[code]

    class hoge{
        std::vector<int> val;
        hoge(const std::vector<int> & val) : val(val){/* 処理 */}
        hoge(std::vector<int> && val) : val(std::move(val)){/* 処理 */}
    };
    
[/code]


CC BY-SA 4.0
2019-06-02T15:12:45.073
55459
2019-06-02T15:30:30.480
2019-06-02T15:30:30.480
34557
34557
55457
answer


質問にあるような「コンストラクタに渡された値をメンバ変数に格納するだけ」パターンでは、値渡し(pass-by-
value)を用いることもできます。オブジェクトのムーブ操作が十分軽量であることを前提として、コンストラクタ引数を左辺値参照(`cosnt
T&`)／右辺値参照(`T&&`)でオーバロードする必要がなくなるため、コンストラクタへの引数個数が多いときに効果的です。

[code]

    class hoge{
        std::vector<int> val;
        hoge(std::vector<int> val) : val(std::move(val)){/* 処理 */}
    };
    
[/code]

C++ソースコード整形ツール Clang-Tidy では [modernize-pass-by-
value](https://clang.llvm.org/extra/clang-tidy/checks/modernize-pass-by-
value.html) でこのようなソースコード変形をサポートします。

下記記事もご参考に：

  * [Tip of the Week #117: Copy Elision and Pass-by-value](https://abseil.io/tips/117)

* * *

値渡しのみ(`T`) と 左辺値参照(`cosnt T&`)＋右辺値参照(`T&&`)オーバーロード
は、トレードオフ関係にあります。前者ではムーブコンストラクタ呼び出し回数が増えることは間違いありません。極限まで実行時オーバーヘッドを気にするのであれば、元の
kizul さん方針の通りオーバーロード方式を維持すればよいと思います。

<https://wandbox.org/permlink/nrR9PpFXo1p0r07E>


CC BY-SA 4.0
2019-06-03T06:14:43.517
55474
2019-06-03T13:14:14.797
2019-06-03T13:14:14.797
49
49
55457
answer