これはこの質問の重複の可能性がありますが、そこで議論されている例は組み込み型 ( ) を扱ってい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部構成です:
- 上記の例の
const
修飾子は何か違いがありますか? class Foo
返された値が の代わりにsome のインスタンスであった場合、問題になるでしょうstd::string
か?
私の同僚は非常に合理的な人々であり、これが多かれ少なかれ偶然にコードベースに忍び込んだ古風な慣習であるという考えにオープンです。しかし、この特定の使用法について、完全に不要であると喜んで言えるほど十分に確信している人は誰もいません。