6

でフォローが許可されていない理由C++

#include <iostream>

class Sample {
public:
  void Method(char x);
  void Method(char const x);
};

void Sample::Method(char x) {
  char y = x;
}

void Sample::Method(char const x) {
  char y = x;
}

int main() {
  Sample s;
  return 0;
}
4

7 に答える 7

6

C ++でフォローが許可されていないのはなぜですか?
その理由は、コンパイラがコンパイルエラーとして表示するのとまったく同じです
。あいまいだからです。

これらの方法があいまいなのはなぜですか?
簡単な答え:C++標準がそう言っているからです。

これらのオーバーロードされたメソッドがあいまいである理由は何ですか?コンパイラーは、呼び出し元が渡された引数
の値をanとして扱いたいかどうかを知りません。コンパイラーは、手元の情報でそれを判別する方法がありません。const

ここでは値渡しに重点が置かれていることに注意してください。引数は値渡しされているため、あいまいさがあります。引数が参照によって渡された場合、コンパイラは、実際のオブジェクト自体が渡されているため、呼び出し元が引数をどのように処理するかを確実に認識します。したがって、コンパイラは適切なオーバーロードを選択できます。

次の例は、上記の説明をより明確に示しています。

オンラインサンプル

class Sample 
{
    public:
        void Method(char &x){}
        void Method(char const x){}
        void Method(char const &x){}
};


int main() 
{
     Sample s;
     return 0;
}
于 2012-05-14T11:45:03.967 に答える
5

理由は実際には答えられませんが、標準§1.3.10によって決定されます。

過負荷解決に関与する関数に関する情報(13.3):そのパラメーターのタイプ、および関数がクラスメンバーの場合は、関数自体のcv修飾子(存在する場合)およびメンバー関数が含まれるクラス宣言しました。

これは、引数のcv修飾子がオーバーロード解決で無視されることを意味します。

参照を使用した同様の(ただし同等ではない)例は機能します。

class Sample {
public:
  void Method(char& x) {}
  void Method(const char& x) {}
};

ここではタイプが異なるため、最初のケースはへの参照charであり、2番目のケースはconst char(への参照ではなく)へのconst参照charです。

于 2012-05-14T11:35:28.797 に答える
3

関数パラメーターに関しては、charchar constは同じデータ型です。

于 2012-05-14T11:33:33.540 に答える
3

これはまだあいまいです。文字引数で呼び出されると、あるバージョンは引数をコピーして、「OK、コピーを変更できます」と言います。もう一方は引数をコピーして、「OK、コピーを変更できません」と言います。コンパイラは、何かのコピーを変更できるかできないかをどのように知ることになっていますか? それはどちらでもうまくいく可能性があります。

于 2012-05-14T11:33:42.130 に答える
2

標準では、これら 2 つの宣言は同等であると規定されています (13.1.3)。

constand/orの有無のみが異なるパラメーター宣言volatileは同等です。つまり、どの関数が宣言、定義、または呼び出されているかを判断するときに、各パラメーターの型の型指定子constvolatile型指定子は無視されます。

typedef const int cInt;

int f(int);
int f(const int);            // redeclaration of f(int)
int f(int) { /* ... */ }     // definiton of f(int)
int f(cInt) { /* ... */ }    // error: redefiniton of f(int)
于 2012-05-14T11:49:00.430 に答える
2

こんな風に通り過ぎると曖昧だから

s.Method('x');

どのバージョンと呼ばれるべきだと思いますか?

于 2012-05-14T11:33:49.540 に答える
0

http://duramecho.com/ComputerInformation/WhyHowCppConst.html

constはその変数に設定値があることを示すため、宣言後に変更することはできません。異なるデータ型ではありません。

于 2012-05-14T11:34:11.943 に答える