
#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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムについて(UNIX)
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語の課題です
-
C# 配列時のrefの意味
-
C言語 エラーの原因がわからな...
-
ラップ関数とはどんなものですか?
-
転置行列アルゴリズム
-
C言語での奇数の和
-
C言語
-
線形補間 2次元テーブル C言語...
-
初項a_0=aとし、漸化式 a_n+1=(...
-
C#のコンパイルエラーCS0120に...
-
構造体のすべての変数を文字列...
-
STLで、vectorのファイルへの読...
-
C言語 逆順の配列の仕方を教え...
-
比較回数と交換回数表示について
-
【C++】関数ポインタの使い方
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
2重定義って??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
【C++】関数ポインタの使い方
-
ラップ関数とはどんなものですか?
-
エラー 添字が付けられた値が、...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
式は定数値が必要です」という...
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
構造体の勉強中です 合計点の高...
-
数字列を3桁ごとにカンマで区切...
-
return 1L
-
std::set<int> で、ある値が何...
-
C#のコンパイルエラーCS0120に...
-
比較回数と交換回数表示について
-
C言語で分からないところがあり...
おすすめ情報
回答ありがとうございます
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違反、参照渡し違反になるでしょうか?