1 名前:デフォルトの名無しさん [2009/01/11(日) 11:21:38 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part65 pc11.2ch.net/test/read.cgi/tech/1230341243/
172 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 16:46:44 ] gcc の話は↓こちらでどうぞ。 GCCについて part8 pc11.2ch.net/test/read.cgi/tech/1192201659/
173 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 12:22:42 ] 聞いた話じゃなぁ
174 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 23:18:14 ] 心を振るわせる話なら信用するのに どうして鼓膜を振るわせる話は信用しようとしないのだ。
175 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:30:19 ] 質問です ソースファイルAでnewしたインスタンスを 別のソースファイルBでdeleteしたりしても大丈夫なんですか?
176 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:39:08 ] インスタンスの実体が対応してれば大丈夫だろ
177 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 01:03:40 ] 変な設計だとは思うけどな
178 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 02:43:52 ] コンストラクタをcppに書いて、デストラクタをインラインでヘッダに書けば普通に起こる状況だな
179 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 08:21:36 ] クロスDLL問題ってのとは全くの別物だよね? そもそもどうしてあれはダメなんだろ?
180 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 09:21:41 ] それは、それぞれでnewとdeleteの実装が別物だとうまくいかないという話。 msvcr90.dllですべて統一するとか、shared_ptrのようにdeleteごと渡すとかすればいい。 そして、コンパイラが違うとvtblやRTTIの形式が違うという話へ続く……。
181 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 09:28:56 ] そんな面倒事に悩まされる前に一つのモジュールに閉じ込める工夫に労力注げ…と
182 名前:179 mailto:sage [2009/03/24(火) 09:35:57 ] >>180-181 へーそういうことか。 ありがとう!
183 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:12:11 ] テンプレートの規則や仕様に 詳しくなれる本ってありますかね?
184 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:25:18 ] >>183 ない
185 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:26:32 ] >>184 嘘つくな洋書で一冊出てるだろ 教えろよ
186 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:27:32 ] >>185 詳しくなれるかどうかは別。 詳しく書いてるかもしれないけど。
187 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:29:14 ] c++ templatesとか c++ template metaprogramming とか
188 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 22:30:10 ] books.google.com/books?id=EotSAwuBkJoC&pg=PP1&dq=c%2B%2B+templates
189 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 01:24:12 ] C++編(標準ライブラリ) 第27章 例外クラス www.geocities.jp/ky_webid/cpp/library/027.html ここで紹介されている std::overflow_error std::underflow_error が起こる例は、例えばどんなのがあるの? 前者はともかく後者がわからん。。。
190 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 03:14:14 ] 標準じゃunderflow_error投げる規定は無さそうだな。 >189
191 名前:189 mailto:sage [2009/03/25(水) 09:38:25 ] >>190 そうなのか。 とりあえず作っちゃった謎の例外か? どうも。
192 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 11:17:10 ] std::underflow_error - Google Code Search www.google.com/codesearch?hl=en&lr=&q=std%3A%3Aunderflow_error&sbtn=Search
193 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 22:41:38 ] 0をboolに変換するとfalse, 0でない数をboolに変換するとtrueになるんだよね? これは分かる。 では falseをintに変換すると0, trueをintに変換すると1 ってのは仕様上正しい? 特に後者が心配でならないんだが、標準で1になることが保証されている?
194 名前:デフォルトの名無しさん [2009/03/25(水) 22:47:03 ] >>193 > 4.5 汎整数昇格 > 4 bool 型の右辺値は,int型の右辺値に変換することができる。falseは,0になり,trueは,1になる。
195 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 23:15:06 ] でも、int値をtrueと比較するのは危険なんだよね。
196 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 23:18:49 ] 別に気にするな 引き継いで逃げ切ればOK
197 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 23:30:32 ] if ( int値を返す式 ) { } は正常に動作するけど if ( int値を返す式 == true ) {} とやると意図したとおりに動かない可能性がでてくる 妙なルール。
198 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 17:19:01 ] >if ( int値を返す式 == true ) {} は if ( int値を返す式 == 1 ) {} と同じ動作?
199 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 18:56:19 ] うん。
200 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 21:25:19 ] 左辺をboolに変換して比較すれば問題ないのにな 変なルールだよな仕方ないけど
201 名前:デフォルトの名無しさん [2009/03/26(木) 21:26:34 ] 201
202 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 01:14:18 ] >>197 C が 0 以外は true と決めてたわけで better C としての C++ は、従うしかなかったんちゃう? まぁ、そんな言語は山ほどあるわけだが………
203 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 10:41:29 ] 比較とか論理演算とかが結果を0と1で返すから trueをそっちに合わせたんじゃね?
204 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 14:23:37 ] #define true 1 #define false 0 typedef char bool; 昔ありそうな超手抜き実装
205 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 14:24:25 ] 手抜き?
206 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 14:30:14 ] Exceptional C++を読むとboolの必要性が説かれている
207 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 14:44:47 ] int値をbool値に変換するのは情報の欠落が生じるけど、その逆は生じない。 だからint型とbool型を比較すると、暗黙の型変換のルールに従って、bool型の方がint型に昇格する。 結果、>>198 のようになって、意図したとおりに動かなくなる。仕様どおり!・3・
208 名前:デフォルトの名無しさん [2009/03/27(金) 21:09:51 ] C++の副作用に関して良く解らないので教えてください。 int a=0; int b=0; int func(int c){ b=a; return c; } このとき、 func(++a); を通ると、bに1が入ることは保障されますよね? func(a++); この場合はどうでしょうか? bに0が入る? bに1が入る? 鼻から悪魔?
209 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:16:01 ] >>208 関数を呼ぶ直前と、関数から戻った直後に副作用完了点がある。 だから、どちらもbは1になる。
210 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:22:54 ] >>209 有難うございます。
211 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:28:25 ] >209 すいません。もうひとつ教えてください。 && || ?: , 以外の演算子は副作用完了点ではないんですよね? 自分でオーバーロードした演算子の場合は 通常の関数と同じように関数に入る直前と戻った直後に副作用完了点はありますか?
212 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:32:31 ] >>211 ある。 ただし、最初にあげてる演算子をオーバーロードした場合、 組み込み演算子と違って、オペランドの評価順序が不定になったり、 ショートサーキットでなくなったりするのには注意。
213 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:42:28 ] 有難うございます。 たびたびすみません。 「オペランドの評価順序が不定になる」とは何ですか? 組み込み演算子でも一般的に不定だと思うのですが、 オーバーロードによって不定でなかったものが不定になる場合があるのですか?
214 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:53:18 ] あ、 組み込みの && || ?: , 演算子の評価順序のことですね? 自己解決しました。
215 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:22:27 ] printfで64bit値(u_int64_t)を表示したい。 32bit環境では %llu 64bit環境では %lu 両対応でスマートな解決法ってないものだろうか? define拾ってきて切り替えるくらいしか思いつかない
216 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:32:40 ] unsigned long long にキャストしていつでも %llu で表示する
217 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:35:15 ] VCとかは%I64uだったような defineで切り替えるしかないんじゃね?
218 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 00:21:24 ] 末尾にLがついてるのってlong int だよな?
219 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 00:25:57 ] >>216 その手があったか! 思考がループしてそこまで考え付かなかった。 thx
220 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 01:23:02 ] C99かC++0xでは<inttypes.h>のPRIu64を使う
221 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 19:28:24 ] >>220 それだと、uint64_t使えというところから始めないと。
222 名前:193 mailto:sage [2009/03/28(土) 19:54:02 ] >>194 あまりにもな遅レスすまんかった!! ちょっと私用が。。。 汎整数昇格 了解しました。 ありがとう。
223 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:31:56 ] 最近C++の勉強をはじめた者なんですが、n個のデータを打ち込んで それらの平均値や標準偏差を求めるプログラムを打ち込んだところ、 .\例題2.1.cpp(10) : error C2679: 二項演算子 '>>' : 型 'const char [2]' の 右オペランドを扱う演算子が見つかりません (または変換できません)。 というエラーが出てしまったんですが、なにが原因かさっぱりわかりません。 いつもと同じように打ち込んだつもりなのですが、原因分かる方いませんか?
224 名前:デフォルトの名無しさん [2009/03/28(土) 23:33:21 ] せめて例題2.1.cppの10行目くらい見せろよ
225 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:43:10 ] cout<<"nの値は?"; cin>>n>>"\n"; こうなっています。見たところどこにもミスはないと思うのですが・・・
226 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:45:32 ] >>225 cout<<"nの値は?"; cin>>n;
227 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:47:54 ] >>225 場合によって意味が変わるけど<<は出力、>>は入力 cin >>n nに入力された値を入力 n>>"\n"; 次に入力された値を"\n"に入力 だぞ? おかしいだろ
228 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 23:50:52 ] >>226 ああ、なるほど!入力と出力の指令が混同してましたね(汗) こりゃ動かんわ・・・どうもありがとうございました!!
229 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:00:58 ] 以下のようなコードを見たのですが、 これってC++のルール上、 ((T*)NULL)->function() は安全にコールできるんでしょうか? class T { void function(){ if (this == NULL){ return; } メンバにアクセス } } function() が virtual だとしたらヌルポ例外ですよね?
230 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:06:01 ] >>299 C++にnull_pointer_exceptionなんて気の利いたもんはない。多分OSがそのプロセスを殺そうとするだけだろう。 経験則ではメンバに触れなければ落ちないけど規格で決まってる訳ではないだろうからお勧めしない。
231 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:07:05 ] 誰もいないところにパスした。 >>230 は>>229 宛
232 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:13:00 ] >>229 ((T*)NULL)-> が現れた時点で未定義動作になる。関数の中身は関係ない。
233 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:20:21 ] >>230 >>232 ありがとうございます。
234 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:41:21 ] ((T*)NULL)->function() このfunction()をstatic関数にしてみるとどうだろう? 有識者のご意見を聞きたい。 class T { public: static void function(){} }; int main() { ((T*)NULL)->function(); return 0; }
235 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:43:43 ] 未定義。だいたいコンパイル通るのか
236 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:46:42 ] 通るよ
237 名前:234 mailto:sage [2009/03/29(日) 00:49:17 ] ちゃんと質問する前にコンパイル済み。 通ったよ。g++ね。 C++では (T*)NULL 自体は未定義じゃないよね? >>232 さんが言っているように >((T*)NULL)-> が現れた時点で未定義動作になる。関数の中身は関係ない。 なのだとしたらstaticだろうが何だろうが確かに未定義になるのだろう。 が、static関数なら実質的にグローバル関数扱いなのではと思っているので疑問だった。 staticなメンバ関数はstaticなメンバ変数にしか触れることができないじゃん。 >>236 チェックしてくれてありがとう。
238 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:54:50 ] c++でcキャストは使うべきじゃないよ。 >229
239 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 00:55:55 ] 今更そこに突っ込む不毛さ。
240 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:01:01 ] class Test { public: void func( void ){ std::cout << "test"; } }; int main( void ) { static_cast<Test*>(NULL)->func(); return 0; } メンバ変数に触れなければこれもコンパイル通って動きそうだけど さすがに未定義か?
241 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:04:39 ] >>240 括弧が足りなくないか?
242 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:06:19 ] ほぼ全ての環境で動くだろうけど未定義。 メンバ関数の呼び出しはつまるところ暗黙の引数thisを含む関数の呼び出しにすぎない。それがNULLであったとしても関数を実行するコードはあるので実行はされる。 でも未定義。
243 名前:237 mailto:sage [2009/03/29(日) 01:07:21 ] >>240 メンバ関数に触れていても通るよ。 コンパイラにはNULLかどうかなんてコンパイル時に分からない。 全く問題無く通り、実行時に鼻から悪魔が出て来ることとなる。
244 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:09:10 ] ところが >>237 が言っているstatic関数になると話は別じゃね? 俺はstatic関数に詳しいとかいうわけじゃないから知らんけど、 グローバル関数に無理矢理クラス内というスコープつけたものという認識。
245 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:21:49 ] >>244 未定義動作になるのは、オブジェクトを指していない参照に対して単項 & や sizeof など特殊な ものを除く演算子を適用した場合はいつでも。 アロー演算子 -> の右にあるのが何だとか関数が static だとかそんなのは関係ない。
246 名前:244 mailto:sage [2009/03/29(日) 01:27:35 ] >>245 へーそうなんだ、ありがと。
247 名前:237 mailto:sage [2009/03/29(日) 01:33:32 ] delete NULL; ってのがあったな。めずらしく安全な例で。
248 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:41:17 ] >245 ポインタだからいいんじゃね? 4.10 Pointer conversions (snip) A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of pointer to object or pointer to function type.
249 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:43:30 ] >>248 p->x は (*p).x と定義されている。
250 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:47:04 ] キャスト演算子だけなら問題ないってことだろ。 ((T*)NULL);
251 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 02:09:54 ] std::vector<ポインタ型> v; というのがあって あるタイミングで v.push_back(アドレス); これやるとmemoty.stlの__rw_basis::data()で落ちるんです。どうやらタイミングとかが関係するみたいなんで どなたかエスパーお願いできないでしょうか?再現ができなくて申し訳ないんですが・・・
252 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 02:13:33 ] >>251 スレ違いです。↓へどうぞ。 pc12.2ch.net/test/read.cgi/tech/1187922645/
253 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 02:16:08 ] 環境書いてよ。それだけだとRogueWave製の標準ライブラリを使ってることぐらいしか分からない。
254 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 02:16:48 ] >>250 それはあたりまえ。だれもそんなところ問題にしていない。
255 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 10:59:55 ] __LINE__みたいに関数名表示するマクロありませんか?
256 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 11:02:31 ] 標準ではC99で__func__。 コンパイラ拡張なら色々。
257 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 11:34:03 ] ちなみにマクロじゃないぜ。
258 名前:デフォルトの名無しさん [2009/03/29(日) 17:40:26 ] 戻り値が指定されてる関数で、 関数の最後にreturnが無くても 関数の最後まで到達しないなら C++の規格上は正しくコンパイル、実行できることは保障されますか? たとえば以下のような記述は問題ないですか? int a(int n){ if (n){ return 0; } else { return 1; } } int b(int n){ if (n*n>=0){ return 0; } } int c(int n){ while(1); }
259 名前:デフォルトの名無しさん [2009/03/29(日) 17:45:52 ] 全部問題あります。
260 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 17:48:43 ] >>258 b()とc()は警告出るだろ
261 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 18:46:39 ] >>258 戻り値が指定されてる関数で、 関数の最後にreturnが無くても 関数の最後まで到達しないなら C++の規格上は正しくコンパイル、実行できることは保障される。 ただ、b() はその条件を満たしていない。
262 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 19:44:12 ] nの値により条件を満たすのでは?
263 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 19:49:06 ] 値によらないだろw
264 名前:デフォルトの名無しさん [2009/03/29(日) 19:56:38 ] 仮に int b(int n){ if (n*n>=0){ return 0; } assert(false); return 1; } と書いても鼻から悪魔が出るだけだな # スレ違いっぽいが
265 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:15:29 ] 俺は、例えばn=1000000って意味に取った
266 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:26:00 ] ああ二乗してるから必ず正なわけか
267 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:27:06 ] でもオーバーフローした時に悪魔だな
268 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 22:07:55 ] aもbもcも書いたとおりにコンパイルも動作もできるし と思っているのだが,bはNGなのか?
269 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 22:12:18 ] bを実行したとき、nの二乗がintをoverflowしたときは鼻から悪魔が出る それ以外はコンパイルも動作もOK
270 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 11:04:54 ] int b(int32_t n) {if (int64_t(n) * n >= 0) return 0;} なら大丈夫かな?
271 名前:デフォルトの名無しさん [2009/03/30(月) 12:38:17 ] 大丈夫も大丈夫じゃないも、問題が起きそうな記述に警告を出してくれない方がよほど大丈夫じゃない
272 名前:デフォルトの名無しさん mailto:sage [2009/03/30(月) 12:50:14 ] 本当に簡単に鼻から悪魔るんだな もうsqrt(abs(n)) <= INT_MAXとかoptionalとか使って部分関数として定義するしかないのか