gpt4 book ai didi

c++ - 三元运算符可以抛出异常吗?

转载 作者:IT老高 更新时间:2023-10-28 23:27:45 25 4
gpt4 key购买 nike

有时有一个函数很方便,甚至需要一个语句(当返回一个 constexpr 时这是必要的)。如果需要检查一个条件并且只允许一个语句,则条件运算符是唯一的选择。如果发生错误,最好从条件运算符抛出异常,例如:

template <typename It>
typename std::iterator_traits<It>::reference
access(It it, It end) {
return it == end? throw std::runtime_error("no element"): *it;
}

但是,当用作 (live example) 时,上述函数无法编译:

std::vector<int> v;
access(v.begin(), v.end());

编译器提示试图将非const 引用绑定(bind)到临时对象。不过,编译器并没有提示 throw 表达式本身。那么问题来了:是否可以从条件运算符中抛出异常,如果可以,上面的代码出了什么问题?

最佳答案

条件运算符在 5.16 [expr.cond] 中描述。它的第 2 段包括以下案文:

The second or the third operand (but not both) is a throw-expression (15.1); the result is of the type of the other and is a prvalue.

这表示允许从条件运算符抛出异常。但是,即使另一个分支是左值,它也会变成右值!因此,不可能将左值绑定(bind)到条件表达式的结果。除了使用逗号运算符重写条件之外,还可以重写代码以仅从条件运算符的结果中获取左值:

template <typename It>
typename std::iterator_traits<It>::reference
access(It it, It end) {
return *(it == end? throw std::runtime_error("no element"): it);
}

有点棘手的事情是,从函数返回 const 引用会编译,但实际上会返回对临时的引用!

关于c++ - 三元运算符可以抛出异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20848132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com