2つのベクトルを作成し、それらを関数に渡し、関数がリストのデータを変更しないことを保証するコードを以下に示します。可能な場所は**const**
と記されています。もし私がお見逃ししたら、私に知らせてください。基本的に私は、賛否両論の面でそれぞれの面で正しい考えがあるのか、どちらを使うべきかを知りたいと思っています。関数宣言でConstを使うことの長所と短所
#include <iostream>
#include <vector>
using namespace std;
int makeSum(/**/ const /**/ vector<int>& lst) /**/ const /**/
{
int total {};
lst.push_back(1);
for (/**/ const /**/ auto& value : lst) {
total += value;
}
return total;
}
int main(int argc, char* argv[])
{
vector<int> test1 = {1, 2, 3, 4, 5};
vector<int> test2 = {2, 3, 5, 6};
cout << makeSum(test1) << endl; //15
cout << makeSum(test2) << endl; //16
return 0;
}
パラメータリスト内のConst:これはCONSTまたは非constベクトル変数のいずれかが、この関数に渡すことができるようになります。しかし、変数名lstはconst変数を参照しているため、変数に
const_cast
が使用されていない限り、ベクトルのデータメンバーを変更することはできません。Const関数宣言の後に:これはメンバー関数である必要がありますが、メンバーの変更は許可されません。
Constに基づく範囲ループ:これは、関数が非constパラメータのみを受け入れるようにしますが、範囲ループが参照を変更しないことを保証します。
私は第2の箇条書きでそれを述べました。 –
定数参照を渡すことについて忘れた場合:非定数参照は、一時オブジェクトまたはリテラル/定数値にバインドできません。 –