1. ホーム
  2. c++

[解決済み] C++で、throwが式の場合、その型は何ですか?

2022-09-24 05:34:20

質問

私はこれをredditへの短い冒険の1つで拾いました。

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

基本的にC++では、と著者は指摘する。

throw "error"

は式です。これは、C++ Standardでは、本文と文法の両方で、かなり明確に記述されています。しかし、(少なくとも私には)明確でないのは、式の型が何であるかということです。私は " と推測しました。 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 ではないようです。

では、それは何でしょうか?

回答される方は、Standardからの引用で裏付けをお願いします。


これは throw 式の型についてというよりも、条件演算子が throw 式をどのように扱うかについてだとわかりました - 今日まで確かに知らなかったことです。 について今日まで知りませんでした。回答してくれたすべての人、特に David Thornley に感謝します。

どのように解決するのですか?

規格5.16第2項第1号によると、"第2または第3オペランド(両方ではない)はthrow-expression (15.1); 結果は他方の型で、rvalueである." したがって、条件演算子はthrow-expressionがどんな型かを気にせず、単に他方の型を使用することになります。

実際、15.1, 1項では明確に"A throw-expression is of type void.".と書かれています。