この記事の参照によるパラメーターのサポートセクションでは、問題を指摘し、参照に対する解決策を提供します。私の質問は、最初にパラメーターを参照として宣言しないのはなぜですか? つまり、代わりに:
const Parm parm_;
行う:
Parm &parm_;
この記事の参照によるパラメーターのサポートセクションでは、問題を指摘し、参照に対する解決策を提供します。私の質問は、最初にパラメーターを参照として宣言しないのはなぜですか? つまり、代わりに:
const Parm parm_;
行う:
Parm &parm_;
参照に関する問題は、スコープガードの使用方法の 1 つの例にすぎないためです。しかし、他のすべての場合でも機能する (そして正しく機能する) はずです。したがって、このクリーンアップ機能があります:
void my_exit(const std::string & msg)
{
std::cout << "my_exit: " << msg << std::endl;
}
これは機能するはずです(一時オブジェクトを渡します):
void test()
{
std::string msg("test_1 Hello World");
ON_BLOCK_EXIT(&my_exit, msg.substr(0, 6));
}
これは機能するはずです (スコープガードが呼び出される前に破棄されるオブジェクトへの参照を渡します):
void test()
{
std::map<int, std::string> m;
m[42] = "test_2";
ON_BLOCK_EXIT(my_exit, m[42]);
m.clear();
}
そして、これはうまくいくはずです(const参照を渡す):
void test(const std::string & msg)
{
ON_BLOCK_EXIT(&my_exit, msg);
}
が const または非 const 参照である場合parm
、これらの例は実行時にコンパイルされないかクラッシュします。
それはする必要があります
const Param ¶m_;
一般的なケースを考慮して、パラメーターをデクリメントまたは他の方法で変更しようとすると、同じ問題が発生します。もう 1 つのオプションは、const バージョンと非 const バージョンを処理するために、さらに多くのクラスを作成することです。
参照を使用すると、式の結果を param として使用できなくなります。これは、関数パラメーターとして作成された一時参照がすぐに範囲外になるためです。
彼はすべての const を削除し、それを型の一部にして式を許可しないようにすることもできましたが、わかりやすくするために ByRef を要求することには大きな価値があると思います。
問題が 1 つあります。C++ では、一時変数は参照にバインドできず、const 参照にのみバインドできます。
したがって、次の記述はできません。
int foo();
int& i = foo();
言語の拡張機能として使用できる Visual C++ を使用しない限り。
また、const 参照を返す関数を使用した場合も機能しません。
ここには簡単な解決策はありません:)
少なくとも、C++0x ラムダが登場するまでは。