gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:51:14 25 4
gpt4 key购买 nike

我在一次短暂的 reddit 尝试中发现了这一点:

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

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

throw "error"

是一个表达式。这实际上在 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
}

编译器对//1 没有任何问题,但在//2 上遇到了问题,因为条件运算符中的类型不同。所以 throw 表达式的类型似乎不是 void。

那是什么?

如果您回答,请使用标准中的引用来支持您的陈述。


事实证明,这与 throw 表达式的类型无关,而与条件运算符如何处理 throw 表达式无关——我当然没有在今天之前知道。感谢所有回复的人,尤其是 David Thornley。

最佳答案

根据标准,5.16 第 2 段第一点,“第二个或第三个操作数(但不是两者)是一个抛出表达式 (15.1);结果是另一个的类型并且是一个右值。”因此,条件运算符不关心 throw-expression 是什么类型,而只会使用其他类型。

事实上,15.1 第 1 段明确指出“抛出表达式的类型为 void。”

关于c++ - 在 C++ 中,如果 throw 是一个表达式,它的类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1212978/

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