[解決済み] C++で、throwが式の場合、その型は何ですか?
質問
私はこれを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.".と書かれています。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?