C++相談室 part87
■ このスレッドは過去ログ倉庫に格納されています
0001ゆとり
2010/12/09(木) 19:31:20このスレはゆとりのためのC++相談室 part87です。
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part86
http://hibari.2ch.net/test/read.cgi/tech/1288976595/
http://hibari.2ch.net/test/read.cgi/tech/1289292155/l50
このスレもよろしくね。
ついでに壁紙にしてね。
http://www.research.att.com/~bs/Bjarne.jpg
0002ゆとり
2010/12/09(木) 19:32:59[C++ FAQ]
http://www.parashift.com/c++-faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[Stroustrup大聖人]
http://www2.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?id=15868
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003ゆとり
2010/12/09(木) 19:34:23[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0004ゆとり
2010/12/09(木) 19:35:36amazon C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
http://www.amazon.co.jp/b/?node=754384
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
0005ゆとり
2010/12/09(木) 19:37:03http://codepad.org/
http://ideone.com/
では、ゆとりの皆さん相談どうぞ。
0006ゆとり
2010/12/09(木) 19:39:58Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
ごめんなさい。これ忘れてた。
0007デフォルトの名無しさん
2010/12/09(木) 20:27:060008v(^・^)v
2010/12/09(木) 21:01:22環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0009デフォルトの名無しさん
2010/12/09(木) 22:36:580010デフォルトの名無しさん
2010/12/09(木) 22:47:470011デフォルトの名無しさん
2010/12/09(木) 23:04:130012デフォルトの名無しさん
2010/12/09(木) 23:11:400013デフォルトの名無しさん
2010/12/09(木) 23:16:130014デフォルトの名無しさん
2010/12/10(金) 00:39:08コマンドライン引数をmain関数以外で取得する方法はありますか?
BCBのParamCount()のようなものを探しています。
0015質問
2010/12/10(金) 00:40:530016デフォルトの名無しさん
2010/12/10(金) 00:42:110017デフォルトの名無しさん
2010/12/10(金) 00:44:150018デフォルトの名無しさん
2010/12/10(金) 00:46:11ランタイムライブラリを動的リンクしてるから
静的リンクすれば必要ない
0020デフォルトの名無しさん
2010/12/10(金) 01:12:14>>1 スレ違い
0021デフォルトの名無しさん
2010/12/10(金) 04:08:480022デフォルトの名無しさん
2010/12/10(金) 10:42:46part80くらいからしか見てないからわからん。
0023デフォルトの名無しさん
2010/12/10(金) 11:31:41かなり前に面白い流れだからって新スレを立てた人が次スレにも貼ったのが
始まりだったと記憶している
0024デフォルトの名無しさん
2010/12/10(金) 12:52:49「STLつかうと〜」の初出が part16 (2003/02/21) で、 part17 にデジャブネタとして
コピペされたときにテンプレ指定され、隣接していた「C1010: プリコンパイル済みヘッダーの〜」の
くだりまでまとめて part18 で貼られ、その後長らくテンプレとして毎度貼られていた。
0025デフォルトの名無しさん
2010/12/10(金) 12:56:44http://mimizun.com/2chlog/tech/pc2.2ch.net/tech/kako/1045/10457/1045746245.html
なんとか16を見つけたところだった。
0026デフォルトの名無しさん
2010/12/10(金) 13:05:56もうすぐ10周年になるようだ。
0027デフォルトの名無しさん
2010/12/11(土) 12:58:140028デフォルトの名無しさん
2010/12/11(土) 16:47:550029デフォルトの名無しさん
2010/12/11(土) 20:01:50どうすればよいでしょう?
0030デフォルトの名無しさん
2010/12/11(土) 20:10:300031デフォルトの名無しさん
2010/12/11(土) 20:14:11{
public:
int operator =( int val ){ return this->val = val; }
private:
int val;
};
これでなんとかしろ
0032デフォルトの名無しさん
2010/12/11(土) 20:17:320033デフォルトの名無しさん
2010/12/11(土) 20:26:220034デフォルトの名無しさん
2010/12/11(土) 21:14:23sizeof演算子の戻り値の型は、std::size_t型であるとされている。
std::size_tは、ライブラリ18.2[support.types]で定義されている。
そこでは、size_tはC規格で定義されているとしている。
C規格では、size_tはsizeof演算子の結果の型であると定義されている!
要するに、何型なの?
0035デフォルトの名無しさん
2010/12/11(土) 21:25:23わざわざコンストラクタ/デストラクタを宣言しますか?
0036デフォルトの名無しさん
2010/12/11(土) 21:25:46The value of the result of both operators is implementation-defined, and its type (an
unsigned integer type) is size_t, defined in <stddef.h> (and other headers).
要するに処理系定義の符号なし整数型
0037デフォルトの名無しさん
2010/12/11(土) 21:51:04でも、インラインと非インラインの関数の違いがイメージ出来ません
説明お願いします
0038デフォルトの名無しさん
2010/12/11(土) 21:56:53++i;
これと
void increment(int& i) { ++i; }
int i = 0;
increment(i);
これ
どっちも同じことしてるけど後者の方が遅いっていうのは分かるよな?
それでinlineを付けるとコンパイル時に前者に置換されるわけだ
0040デフォルトの名無しさん
2010/12/11(土) 22:17:20> どっちも同じことしてるけど後者の方が遅いっていうのは分かるよな?
わかんねーだろjk
37 も何納得してんだ。
アセンブリレベルのコードで比較しないと意味無い。
0041デフォルトの名無しさん
2010/12/11(土) 22:18:430042デフォルトの名無しさん
2010/12/11(土) 22:18:470043デフォルトの名無しさん
2010/12/11(土) 22:33:11スタック積む?処理がなくなるから
オーバーヘッドがなくなるってことなんじゃないの?
C++ はじめてまだ15分ほどなんでよくわからないですけど。
Cは未経験です。
童貞って意味じゃないです。
いや、まぁ童貞なんですけどね。
0044デフォルトの名無しさん
2010/12/11(土) 23:15:31目指しているものと一致してるかはわからんが
演算子をオーバーロードして範囲チェックを行うやり方があるね
範囲そのものはポリシーで挿げ替えるという実装
オライリーの本だかに載ってたと思う
0045デフォルトの名無しさん
2010/12/12(日) 00:44:41ありがとうございます。
0046デフォルトの名無しさん
2010/12/12(日) 01:14:03おいおい安易に納得するな
inlineはregister指定と同じで、コンパイラはこれを無視する事が出来る
本当にインラインになっているかどうかは>>40の言う通りで逆アセンブル
画面を出して見てみないと分からないぞ
0047デフォルトの名無しさん
2010/12/12(日) 01:15:040048デフォルトの名無しさん
2010/12/12(日) 02:03:42これ見て後者が遅いと思い込むなんてのは、 for の中で変数宣言したら
遅くなるから外で(なんならグローバルで)とか言うのと同じような勘違いだ。
C++ 上の字面とパフォーマンスを直結させるべきじゃない。
0049デフォルトの名無しさん
2010/12/12(日) 03:30:57必ずinline展開されると思い込んでいる馬鹿もどうかと思うけどね
0050デフォルトの名無しさん
2010/12/12(日) 03:43:340051デフォルトの名無しさん
2010/12/12(日) 10:20:09inlineはリンカに関数定義の重複を無視するように指示するものだと考えた方が
実用上は便利だ。
0052デフォルトの名無しさん
2010/12/12(日) 10:48:550053デフォルトの名無しさん
2010/12/12(日) 10:55:58質問の意図を履き違えて関係ないことをべらべら喋り出すアホの典型
0054デフォルトの名無しさん
2010/12/12(日) 13:47:58string &m_str;
public:
Super(string &s) : m_str(s) {};
}
class Sub : public Super {
public:
Super(): Super("string") {};
}
スーパークラスの&m_strを使う事は危険ですか?
0055デフォルトの名無しさん
2010/12/12(日) 13:56:59そもそもprotectedでないと派生からはm_strは使えない
それとなぜに参照?""で渡すと
一時オブジェクトが破棄されて存在しないものの参照が出来上がるんじゃないか?
0057デフォルトの名無しさん
2010/12/12(日) 14:12:20005854
2010/12/12(日) 14:32:54って怒られるんだね
知らなかった
0059デフォルトの名無しさん
2010/12/12(日) 14:54:140060デフォルトの名無しさん
2010/12/12(日) 15:03:45したよ
0061デフォルトの名無しさん
2010/12/12(日) 15:05:440062デフォルトの名無しさん
2010/12/12(日) 15:22:52class Super {
protected:
const std::string& m_str;
void write() const {
std::cout << m_str << std::endl;
}
public:
Super(const std::string& s) : m_str(s) {};
};
class Sub : public Super {
public:
Sub() : Super(std::string("string")) {};
void write() const {
Super::write();
}
};
int main()
{
Sub* s = new Sub;
s->write();
delete s;
}
0063デフォルトの名無しさん
2010/12/12(日) 15:26:42そういえばコンパイラが無視していいものの中には volatile もあるな
>>51
単一定義規則は inline がついていても見逃してもらえないぞ
0064デフォルトの名無しさん
2010/12/12(日) 16:05:40class Superのm_strが束縛する責任があるのはコンストラクタのsのみ
コンストラクタのsを束縛する必要があるのはSubのコンストラクタの一時変数のstringのみ
したがってm_strはSubのstringを束縛する責任がない
つまり、Superのコンストラクタの実行が完了した時点でSubのstringの一時変数は解体
されてしまうので、m_strの参照は実体が無くなる
これを防ぐには
class Super {
protected:
const std::string m_str; // 参照にしない
void write() const {
std::cout << m_str << std::endl;
}
public:
Super(const std::string& s) : m_str(s) {}
};
のようにコピーを保持しなければならない
0065デフォルトの名無しさん
2010/12/12(日) 16:10:12なるほど、const参照のconst参照という風に2段以上に重ねると
問題が生じるようですね
これは盲点でした
これから気を付けます
ありがとうございました
0066デフォルトの名無しさん
2010/12/12(日) 19:12:28Super s ( std::string("string") );
の時点でアウトなんだよ。
SuperとかSubとか書いてたり、仮想関数を知らなかったりするあたりJava使いだと思うんだが、
Javaの発想は全部捨てないとCやC++はぜんぜん挙動が違うぞ?
0067デフォルトの名無しさん
2010/12/12(日) 20:11:51volatile は無視しちゃいかんだろう。
inline で単一定義規則の制限が少し楽になるのは確かだろう。
0068デフォルトの名無しさん
2010/12/12(日) 20:13:34なんでアウトなんだよ
ただの一時オブジェクトじゃないか
それに今回は仮想関数は必要ないだろう
0069デフォルトの名無しさん
2010/12/12(日) 20:15:280070デフォルトの名無しさん
2010/12/12(日) 20:19:48だから具体的にどうアウトなんだよ?
0071デフォルトの名無しさん
2010/12/12(日) 20:21:56一時オブジェクトを指して初期化された参照は、 Supuer の初期化が完了した時点ではすでに
無効になっている。 >>66 にある初期化の後、 s を使ったあらゆる操作が未定義動作になりうる。
0072デフォルトの名無しさん
2010/12/12(日) 20:22:42だからお前の言ってる事は>>64で全部書いてあるだろう
なぜ同じ事を二度も言うんだ?
0073デフォルトの名無しさん
2010/12/12(日) 20:23:480074デフォルトの名無しさん
2010/12/12(日) 20:26:07どうして>>65が「さっぱり」理解してない事がお前にわかるんだ?
0075デフォルトの名無しさん
2010/12/12(日) 20:29:4665 が理解している問題発生の条件は「const参照のconst参照という風に2段以上に重ねると」
となっているが、実際には2段重ねなくたって同じ問題は発生する。
struct S { std::string const& s } s = { std::string("string") };
0076デフォルトの名無しさん
2010/12/12(日) 20:30:44だったら最初からそのようにシンプルに書けばいいだろう
ネチネチと厭らしいんだよてめえの書き方は
0077デフォルトの名無しさん
2010/12/12(日) 20:32:34だいたいコンパイルが通らないコードを書いてどうするつもりなんだよ?
0078デフォルトの名無しさん
2010/12/12(日) 20:34:110079デフォルトの名無しさん
2010/12/12(日) 20:35:30#include <string>
struct S { std::string const& s; } s = { std::string("string") };
0080デフォルトの名無しさん
2010/12/12(日) 20:38:27「コンストラクタがありません」と言われますけど?
0081デフォルトの名無しさん
2010/12/12(日) 20:44:01codepad では通るようだが、環境は?
http://codepad.org/WVPBNYkZ
0082デフォルトの名無しさん
2010/12/12(日) 20:49:11BCC(ECC)6.3.1だ
エラーメッセージは「リファレンス メンバ 'S::s' があるクラスにコンストラクタがない」だ
当然だと思うが?
gccの拡張だろう
0083デフォルトの名無しさん
2010/12/12(日) 20:51:31一時オブジェクトと参照がどういうもかと言う基礎的ことを知らないってのが原因じゃね
恐らく、>>62はポインタ使ったのでも一時オブジェクトを気合を入れて指すコード書くんだろうな
0084デフォルトの名無しさん
2010/12/12(日) 20:52:29だからお前のは単なる憶測に過ぎないから
なんでそう自分の価値観を人に押しつける?
うぬぼれが強すぎるんと違うか?
0085デフォルトの名無しさん
2010/12/12(日) 20:57:28codepad は -std=c++98 -pedantic-errors だから gcc 拡張の線は薄いな。
http://codepad.org/about
暗黙宣言のデフォルトコンストラクタが使われれば暗黙定義で S::s が初期化されて
いないことが問題になるだろうが、この例では { ... } による初期化が行われているので
問題にならないほうが正しいと思う。
0086デフォルトの名無しさん
2010/12/12(日) 21:10:40§12.6
4 If a given nonstatic data member or base class is not named by a mem-initializer-id (including the case
where there is no mem-initializer-list because the constructor has no ctor-initializer), then
? If the entity is a nonstatic data member of (possibly cv-qualified) class type (or array thereof) or a base
class, and the entity class is a non-POD class, the entity is default-initialized (8.5). If the entity is a nonstatic
data member of a const-qualified type, the entity class shall have a user-declared default constructor.
? Otherwise, the entity is not initialized. If the entity is of const-qualified type or reference type, or of a
(possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of
a const-qualified type, the program is ill-formed.
お前さんの言っている事はデタラメである事がはっきりしている
0087デフォルトの名無しさん
2010/12/12(日) 21:15:11念のためにこれも付け加えておくか
After the call to a constructor for class X has completed, if a member of X is neither specified in the
constructor’s mem-initializers, nor default-initialized, nor value-initialized, nor given a value during execution
of the body of the constructor, the member has indeterminate value.
はっきりと「メンバの値は不定」と書いてあるだろう
つまりgcc拡張である事が明らかだ
0088デフォルトの名無しさん
2010/12/12(日) 21:15:25いや、だからさ、それは暗黙定義のデフォルトコンストラクタで問題になるわけで、
>>79 では暗黙定義のデフォルトコンストラクタは使われていないから問題ないだろ。
0089デフォルトの名無しさん
2010/12/12(日) 21:18:29お前英語が読めないんだろう
the program is ill-formed.
の意味が分かるか?
リファレンスをメンバに持っていてそれがコンストラクタで初期化されない時は
そのプログラムは不適格とすると書いてあるだろう
つまりコンパイルが通らないので正しいわけだ
0090デフォルトの名無しさん
2010/12/12(日) 21:21:53それも関係ない。参照型メンバは初期化リストで初期化されなければコンパイルエラーに
なるから、当該のコンストラクタが実行されることもないし、もちろん完了することも無い。
0091デフォルトの名無しさん
2010/12/12(日) 21:23:02コンストラクタ定義の中で >>86 の条件に合えば ill-formed なんだよ。
>>79 では問題のコンストラクタ定義が無い。
何度言わせるんだ?お前は日本語が読めないのか?
0092デフォルトの名無しさん
2010/12/12(日) 21:27:15もう好きなようにしろ
規格を呈示しても難癖付ける奴にはもう言う事はないよ
自分独自の世界でプログラムでもしてろ
0093デフォルトの名無しさん
2010/12/12(日) 21:31:22規格を提示って言っても、関係ないところ提示されて話になるわけないだろ。
0094デフォルトの名無しさん
2010/12/12(日) 21:32:40「英語が読めない奴はJIS規格でも読んでろ」
0095デフォルトの名無しさん
2010/12/12(日) 21:35:470096デフォルトの名無しさん
2010/12/12(日) 21:43:03よく分らんが、
struct S { std::string const& s; } s = { std::string("string") };は
"{" std::string("string") "}";
{}あるからSはクラスじゃなくC的な構造体ととらえられてるんじゃない?
C++のstructはpublic class扱いのみで、データをまとめるC的structとしては扱えないの?
クラス扱いでs = { std::string("string") }; はありえる?
009766
2010/12/12(日) 21:44:53>なるほど、const参照のconst参照という風に2段以上に重ねる
これに対して「何を面白いことを」ですよ^^
>>64のいってることはあってますよ^^
0098デフォルトの名無しさん
2010/12/12(日) 21:47:25> {}あるからSはクラスじゃなくC的な構造体ととらえられてるんじゃない?
逆。 aggregate として扱われているから { ... } による初期化ができる。
> C++のstructはpublic class扱いのみで、データをまとめるC的structとしては扱えないの?
問題なく扱える。
> クラス扱いでs = { std::string("string") }; はありえる?
あり得る。
エラーが発生しているのは BCC(ECC) のバグ。
0099デフォルトの名無しさん
2010/12/12(日) 22:06:010100デフォルトの名無しさん
2010/12/12(日) 22:32:19Cスタイルの初期化でコンストラクタとかもう聞いただけで汚らわしい
0101デフォルトの名無しさん
2010/12/12(日) 22:39:15むしろ、ユーザー定義のコンストラクタがあるほうがだめ。
■ このスレッドは過去ログ倉庫に格納されています