
#include <iostream>
template <typename T>
T minimum(const T& lhs, const T& rhs)
{
return lhs < rhs ? lhs : rhs;
}
int main()
{
int a=2;
int b=3;
int i = minimum<int>(a, b);
std::cout << i << std::endl;
return 0;
}
において
const T& lhs
のところで
Tにconstと&が修飾されていますがこれはどういう効果があるのでしょうか?
No.2ベストアンサー
- 回答日時:
constでない変数やリテラルをconstな変数で参照しても違反にはなりません。
質問の文脈ではconstは関数minimum内で変数が変更されないことを要請しているだけですので、関数の外での制約はありません。main内だけでconst違反を起こそうとすれば、main内でconst変数を宣言して書き換える必要があります。
回答ありがとうございます
関数内で変数を変更しないということの使用者への情報通知ということと
関数作成者がうっかりconst変数を変更したときに
コンパイラに関数作成者に注意してほしいということですね
No.1
- 回答日時:
> const T& lhs
constは定数の意味で、lhsが変更できない変数であることを示します。
&はlhsが参照変数であることを示します。関数の引数の場合、その引数が値渡しではなく参照渡しであることを示しています。
値渡しは変数の内容をコピーして渡しますが、参照渡しでは変数への参照を渡すため、大きなオブジェクトを引数にする際にはコピー処理がない分だけ早くなります。コピーコンストラクタの引数などはそもそも値渡しが理屈乗できないので参照渡ししかないですしね。
参照渡しだと関数内で変数値を上書きした場合は呼び出し元も上書きされてしまいますが、constにしておけばそもそも上書きできないので上書きの危険はなくなります。
なお参照渡しはポインタ渡しと似ていますが、変数の使い方が違っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
エラー 添字が付けられた値が、...
-
「指定されたキャストは有効で...
-
【C++】関数ポインタの使い方
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
CStringの配列要素を関数で受け...
-
最早開始時間と最遅完了時刻を...
-
「{ } で囲むだけ」は正しい?
-
足して100になるような乱数のア...
-
double型の値を、一桁ずつint型...
-
C言語の課題です
-
次のプログラムを教えてくださ...
-
(int *)の意味
-
線形補間 2次元テーブル C言語...
-
C言語 配列と関数の練習問題
-
ファイルに含まれるアルファベ...
-
C言語/ランダムbeepのプログラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
(int *)の意味
-
ColorをRGBで指定する方法
-
未解決の外部シンボル _printf...
-
構造体の勉強中です 合計点の高...
-
商と剰余を同時に求める(C言語)
-
C言語で分からないところがあり...
-
式は定数値が必要です」という...
-
C言語での奇数の和
-
std::set<int> で、ある値が何...
-
課題でつまってます・・・
-
int16_t の _t は何?
-
比較回数と交換回数表示について
おすすめ情報
回答ありがとうございます
int main()の部分だけを
int main()
{
int a=2;
int b=3;
int i = minimum<int>(a, b);
int j = minimum<int>(3, 2);
a=b=7;
int k = minimum<int>(a, b);
std::cout << "Hello World!" << std::endl;
std::cout << i << std::endl;
std::cout << j << std::endl;
std::cout << k << std::endl;
return 0;
}
に変えてもエラーになりません
どうすればconst違反、参照渡し違反になるでしょうか?