dポイントプレゼントキャンペーン実施中!

#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と&が修飾されていますがこれはどういう効果があるのでしょうか?

質問者からの補足コメント

  • 回答ありがとうございます
    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違反、参照渡し違反になるでしょうか?

      補足日時:2024/06/14 13:01

A 回答 (2件)

constでない変数やリテラルをconstな変数で参照しても違反にはなりません。

質問の文脈ではconstは関数minimum内で変数が変更されないことを要請しているだけですので、関数の外での制約はありません。
main内だけでconst違反を起こそうとすれば、main内でconst変数を宣言して書き換える必要があります。
    • good
    • 1
この回答へのお礼

回答ありがとうございます
関数内で変数を変更しないということの使用者への情報通知ということと
関数作成者がうっかりconst変数を変更したときに
コンパイラに関数作成者に注意してほしいということですね

お礼日時:2024/06/14 13:28

> const T& lhs


constは定数の意味で、lhsが変更できない変数であることを示します。
&はlhsが参照変数であることを示します。関数の引数の場合、その引数が値渡しではなく参照渡しであることを示しています。
値渡しは変数の内容をコピーして渡しますが、参照渡しでは変数への参照を渡すため、大きなオブジェクトを引数にする際にはコピー処理がない分だけ早くなります。コピーコンストラクタの引数などはそもそも値渡しが理屈乗できないので参照渡ししかないですしね。
参照渡しだと関数内で変数値を上書きした場合は呼び出し元も上書きされてしまいますが、constにしておけばそもそも上書きできないので上書きの危険はなくなります。
なお参照渡しはポインタ渡しと似ていますが、変数の使い方が違っています。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています