2

この質問がすでに回答されている場合はお詫びします-私は検索しましたが、参照を渡す際のより一般的な質問の数が非常に多いため、検索用語を見つけるのは困難です。

私が抱えている問題は、この種のものをコンパイルすると、レベル4の警告が表示されることです。

class MyClass
{
public:
    MyClass() {};
};

void DoSomethingToMyClass(MyClass& my_class_reference);


void MyRoutine()
{
    DoSomethingToMyClass(MyClass());
};

警告(C4239)は、基本的に、インスタンスから参照への危険なキャストがあることを示しています。レベル4の警告を書き留めないように注意深く調べたところ、多くの人が-1をsize_t(size_t(-1)を知るためのボーナスポイント)として返すなど、私の(および他の人の)コードのバグを特定したためです。実際には)。

上記のコードが実際に何をするのか誰かが私に説明できますか?私の最も偏執的な理論は次のとおりです。

  • MyClass()のインスタンスはオンザフライで作成されますが、適切なハンドルが与えられていません。
  • my_class_reference参照で実行された操作は、失火します。

もう1つの極端な点は、C4239は常に無視できるということです...

* [類似の状況は、誰かが参照をデフォルトにした場合です。

void DoSomethingToMyClass(MyClass& my_class_reference=MyClass());

これは同じ警告を生成しますが、別のトピックで部分的にカバーされています。] *

編集:

迅速な対応に感謝します。申し訳ありませんが、VisualStudioのVC++について言及する必要があります。

4

2 に答える 2

8

これは標準の C++ ではなく、一時変数を非const参照にバインドできるようにする MS 拡張であるため、警告が表示されます。

ただしないでください。パラメータをconst参照するかのいずれかです。

void DoSomethingToMyClass(const MyClass& my_class_reference);

メソッドがクラスを変更するか、事前にオブジェクトを作成することを意味するため、ここでは適用されない可能性があります。

MyClass x;
DoSomethingToMyClass(x);
于 2013-01-17T09:19:18.157 に答える
3

MyClass()C++ 標準の一時オブジェクトは非定数参照にバインドできません。したがって、警告。
一部のコンパイラでは、これを言語拡張として許可しています。

その
ため、インターフェイスを変更して const 参照を取得して一時的にバインドする必要があります。

void DoSomethingToMyClass(const MyClass& my_class_reference)
                          ^^^^^^^

または、一時的な名前のないオブジェクトを渡さないでください。名前付きのオブジェクトを渡します。

void DoSomethingToMyClass(MyClass& my_class_reference);

Myclass obj;
DoSomethingToMyClass(obj);
于 2013-01-17T09:18:56.257 に答える