5

gcc 4.2では、これは機能します。

#include <stdexcept>
#include <iostream>

int main() {
    try {
        throw std::runtime_error("abc");
    } catch (const std::exception& ex) {
        std::cout << ex.what();
    }
}

Xcode 4.3.2(iOS with LLVM 3.1、-std = c ++ 11)では、これはで失敗し、次の行terminate called throwing an exceptionに到達することはありません。NSLog(…)

#include <stdexcept>

int main() {
    try {
        throw std::runtime_error("abc");
    } catch (const std::exception& ex) {
        NSLog(@"%s", ex.what());
    }

    return UIApplicationMain(argc, argv, nil, nil);
}

しかし、これは機能します:

#include <stdexcept>

int main() {
    try {
        throw std::runtime_error("abc");
    } catch (const std::runtime_error& ex) {
        NSLog(@"%s", ex.what());
    }

    return UIApplicationMain(argc, argv, nil, nil);
}

何が得られますか?

4

1 に答える 1

2

gccは正しいです:

15.3p3ハンドラーEは、次の場合にタイプの例外オブジェクトに一致します。

  • ... また
  • ハンドラーはタイプcv Tまたはcv T&であり、、またはTの明確なパブリックベースクラスですE
  • ..。

これはxcodeのバグのように聞こえます(そして驚くほど基本的なバグです!)

于 2012-05-15T14:24:17.107 に答える