Xcode/LLVM catch子句与派生类型不匹配

Mar*_*tos 5 c++ xcode exception-handling llvm

在gcc 4.2中,这有效:

#include <stdexcept>
#include <iostream>

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

在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);
}
Run Code Online (Sandbox Code Playgroud)

但这有效:

#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);
}
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?

asc*_*ler 2

海湾合作委员会是正确的:

15.3p3处理程序E与类型为if的异常对象匹配

  • ... 或者
  • 处理程序的类型为cv Tcv T&并且是, 或T的明确公共基类E
  • ...

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