1

これはこの質問の重複の可能性がありますが、そこで議論されている例は組み込み型 ( ) を扱っていintます。私の現在の仕事では、コード レビューで、次のような関数の宣言に失敗したというフラグが立てられ続けています。

std::string getName();

なので:

const std::string getName();

後者は私には無意味に思えますが、const修飾子によってコンパイラが戻り値のコピー (または同様の最適化) を作成することを回避できる可能性があると感じている同僚が何人かいます。私はgcc -sこの小さなテストプログラムを実行しました:

#include <iostream>
#include <string>

const std::string name()
{
    return "World";
}

int main()
{
    std::cout << "Hello, " << name() << '!' << std::endl;
    return 0;
}

const関数からを削除すると、生成されるアセンブリは同じになりname()ます。ただし、私の同僚は、修飾子によって提供される最適化 (存在する場合) はconstプラットフォーム/コンパイラ固有である可能性があるため、const「念のため」に追加することをお勧めします。私はこの習慣を採用するのをためらっています。なぜなら、これを行うコードを実際に見つけることができなかったからです。

だから私の質問は2部構成です:

  1. 上記の例のconst修飾子は何か違いがありますか?
  2. class Foo返された値が の代わりにsome のインスタンスであった場合、問題になるでしょうstd::stringか?

私の同僚は非常に合理的な人々であり、これが多かれ少なかれ偶然にコードベースに忍び込んだ古風な慣習であるという考えにオープンです。しかし、この特定の使用法について、完全に不要であると喜んで言えるほど十分に確信している人は誰もいません。

4

2 に答える 2

1

の場合の両方で

std::string getName();

const std::string getName();

作成された文字列のコピーがあります。ただし、次のように書く限り:

std::string name;
...
name = getName();

の戻り値の型が const であるかどうかに関係なく、コンパイラはコピーを最適化し、一時的なコピーを作成せずにgetName()内部値を変数にgetName直接コピーします。name

ただし、代わりに参照を返す場合:

std::string& getName();

また

const std::string& getName();

最初のフォームで次のことができるため、大きな違いがあります。

getName() = "Mats";

これはおそらく、インターフェイスのユーザーに実行してほしくないことです。

私には、レビュアーがこれら 2 つのバリアントを混同しているように思えます。

于 2013-10-12T20:09:44.373 に答える