相关疑难解决方法(0)

在C++中,如果throw是一个表达式,它的类型是什么?

我在我的一个简短的尝试中选择了这个来reddit:

http://www.smallshire.org.uk/sufficientlysmall/2009/07/31/in-c-throw-is-an-expression/

基本上,作者指出在C++中:

throw "error"
Run Code Online (Sandbox Code Playgroud)

是一种表达.这在C++标准中实际上非常清楚地阐明了,包括主文本和语法.但是,至少对我来说不清楚的是表达的类型是什么?我猜到了" void",但是有点尝试使用g ++ 4.4.0和Comeau产生了这样的代码:

    void f() {
    }

    struct S {};

    int main() {
        int x = 1;
        const char * p1 = x == 1 ? "foo" : throw S();  // 1
        const char * p2 = x == 1 ? "foo" : f();        // 2
    }
Run Code Online (Sandbox Code Playgroud)

编译器对// 1没有问题,但在// 2上进行了禁止,因为条件运算符中的类型不同.所以throw表达式的类型似乎不是空的.

那是什么?

如果您回答,请使用标准中的引号备份您的陈述.


事实证明,抛出表达式的类型并不像条件运算符如何处理throw表达式那样 - 这在今天之前我当然不知道.感谢所有回复的人,尤其是David Thornley.

c++ throw

115
推荐指数
3
解决办法
5464
查看次数

可以从三元运算符抛出异常吗?

有时候只需要一个语句(返回时就必须这样)是方便的,甚至是必要的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;
}
Run Code Online (Sandbox Code Playgroud)

但是,当用作例如(实例)时,上述函数不会编译:

std::vector<int> v;
access(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

编译器抱怨尝试将非const引用绑定到临时.不过,编译器并没有抱怨throw-expression本身.所以问题是:可以从条件运算符抛出异常,如果是这样,上面的代码出了什么问题?

c++ constexpr c++11

23
推荐指数
3
解决办法
1456
查看次数

标签 统计

c++ ×2

c++11 ×1

constexpr ×1

throw ×1