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(带有 LLVM 3.1 的 iOS,-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 Tcv T&并且T是 的明确公共基类E,或
  • ...

这听起来像是一个 xcode 错误(而且是一个令人惊讶的基本错误!)

于 2012-05-15T14:24:17.107 回答