【问题标题】:Why is throw an expression?为什么是抛出一个表达式?
【发布时间】:2015-09-20 23:00:28
【问题描述】:

以下帖子讨论了throw 表达式的类型:In C++, if throw is an expression, what is its type?。我想澄清一个更基本的事情:为什么throw首先应该是一个表达式而不是一个(非表达式)语句,就像return一样?我的意思是,有人想写auto x = throw std::runtime_error("Error message") 之类的东西吗?

【问题讨论】:

    标签: c++


    【解决方案1】:

    如果throw 是一个语句,则不能将其与条件运算符一起使用。

    return success()
        ? computation()
        : throw std::runtime_error("oops");
    

    注意:这可能会或可能不会使用外部代码混淆。

    编辑:一个有用的案例是在 C++11 的严格 constexpr 函数中,它只能包含一条指令。感谢@dyp 的洞察力!

    【讨论】:

    • 该笔记的另一个 +1,我希望有人评论。看来我不能投票两次 :(
    • 加一个,虽然可能值得注意的是 throw std::runtime_error("oops")void 类型的表达式,并且由于一些技术技巧阻止我自己回答这个问题,它只能在条件下工作。
    • @MeirGoldenberg 逗号运算符求值并丢弃其左操作数,然后求值并返回其右操作数。在这里,它每次都会抛出异常,所以这不是真的有用它在语法上是正确的。
    • "注意:这可能会或可能不会使用外部代码混淆。" 这是 C++11 constexpr 函数中的一项重要技术。这些可能只包含一个 return 语句(加上声明),因此 if 语句通常由三元运算符替换。请注意,在 constexpr 函数中允许抛出异常;如果在编译时调用 throw,编译器将报告错误(这是您想要的)。
    • 另一方面,throw 作为表达式早于constexpr。因此,我不确定能够将throw 放入条件语句中是否足够激励。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    相关资源
    最近更新 更多