カンマ演算子で死亡
諸事情でカンマ演算子を使いたいなぁ…というシーンに遭遇したのですが、何でかコンパイルが通らなくて死亡。
最終的に↓ココまで単純化したのですが、コンパイルが通らない…はて…
int main() { int n = 1, 2, 3; // error C2059: 構文エラー : '定数' return 0; }
カンマ演算子って、最後の文が戻り値的なモノになるんだから、この場合 n = 3 されるコードになるんちゃうのー? あれー? あれー?
…えぇ、バカでした。えぇ。
int main() { int n = (1, 2, 3); // OK! return 0; }
さっきのは int n = 1 が最初に結合しちゃってたんですねおそらく。 カンマ演算子優先度低いですからね… あぁアホしたわ…(苦笑 orz
やりたかったこと
int n = (A(), func());
した時の一次オブジェクトの破棄タイミングを知りたかったんですね。 A() した後に func() が呼ばれている際、Aは既に破棄されているのか否か。 多分、破棄されて *いない* と思うのですが確信はなかったのでチェック
#include <iostream> class A { public: A() { std::cout << "A()" << std::endl; } ~A() { std::cout << "~A()" << std::endl; } }; int func() { std::cout << "func()" << std::endl; return 2; } int main() { int n = (A(), func()); return 0; } === 出力結果 === A() func() ~A()
おー
んまぁこれだけだと func() の中で A 創れよって話なんですけどねコレ(ぉ