11

定数の初期化をラップするときに、スコープの問題に頻繁に遭遇します

try {
  const int value = might_throw();
}
std::cout << value << "\n";  /* error, value out of scope */

現在、回避策として一時的な値を使用しています。const-try {}状況に対処するためのより良い方法はありますか?

int tmp;  /* I'd rather have tmp const */
try {
  tmp = might_throw();
}
catch (...) {
  /* do something */
}
const int value = tmp;
4

3 に答える 3

10

あなたの代わりに

int tmp;  /* I'd rather have tmp const */
try {
    tmp = might_throw();
}
catch (...) {
    /* do something */
}
const int value = tmp;

あなたはこれを行うことができます:

int int_value()
{
    try {
        return might_throw();
    }
    catch (...) {
        /* do something */
        return the_something_value;
    }
}

int main()
{
    int const value = int_value();
}

または、C++11 でできること

int main()
{
    int const value = []() -> int {
        try {
            return might_throw();
        }
        catch (...) {
            /* do something */
            return the_something_value;
        }
    } ();
}
于 2012-11-12T12:10:34.570 に答える
3

私には、これは関数の場合のように見えます:

int const value = []()->int {
    try { return might_throw(); }
    catch (...) { return come_up_with_a_value_differently(); }
}();
于 2012-11-12T12:10:57.403 に答える
0
try {
   const int value = might_throw();
   std::cout << value << '\n';
}
catch (...) {
   std::cout << "threw instead of giving me a value :(\n";
}

try理由でスコープブロックです!

よりもはるかに多くのことをしている場合はstd::coutvalueそうです、少し面倒になります。次に、次の選択肢があります。

  • const、_
  • 、またはで使用するすべてのロジックを囲みますvaluetry
  • それ自体が try/catch をラップし、スロー時にデフォルトを返すconst int関数によって返された値からa を初期化します。int mightThrowWrapper(int default = 0)次に、ローカライズされた例外処理 constネスを取得しました!
于 2012-11-12T12:08:35.927 に答える