トップページ⇒tech
1001コメント293KB

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
■Libraries■
[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:36
■Books■
amazon 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:03
■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/

では、ゆとりの皆さん相談どうぞ。
0006ゆとり2010/12/09(木) 19:39:58
■Books(Templateまわり)■
Effective 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:06
おっつ
0008v(^・^)v2010/12/09(木) 21:01:22
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0009デフォルトの名無しさん2010/12/09(木) 22:36:58
javaではpublic class{}と出来ますが、C++はクラスの修飾子が無いんですか?
0010デフォルトの名無しさん2010/12/09(木) 22:47:47
ありません
0011デフォルトの名無しさん2010/12/09(木) 23:04:13
名前空間が後付けだから必要なかったのかなー。
0012デフォルトの名無しさん2010/12/09(木) 23:11:40
enum A { a, b, c } に d を動的に増やすことはできますか?
0013デフォルトの名無しさん2010/12/09(木) 23:16:13
enumってコンパイル時定数だよね。
0014デフォルトの名無しさん2010/12/10(金) 00:39:08
gccで開発しているのですが、
コマンドライン引数をmain関数以外で取得する方法はありますか?
BCBのParamCount()のようなものを探しています。
0015質問2010/12/10(金) 00:40:53
VC++2005でコンパイルするとVC++2005再頒布可能パッケージがどうして必要になるのでしょうか?
0016デフォルトの名無しさん2010/12/10(金) 00:42:11
そういう仕様だから
0017デフォルトの名無しさん2010/12/10(金) 00:44:15
A n = (A)3;
0018デフォルトの名無しさん2010/12/10(金) 00:46:11
>>15
ランタイムライブラリを動的リンクしてるから
静的リンクすれば必要ない
0019質問2010/12/10(金) 01:02:00
>>16
無駄なレスで貴重なスレを消耗しないでください。
0020デフォルトの名無しさん2010/12/10(金) 01:12:14
>>19
>>1 スレ違い
0021デフォルトの名無しさん2010/12/10(金) 04:08:48
そういやいつの間にか>>8は1レスにまとめられるようになってたんだな
0022デフォルトの名無しさん2010/12/10(金) 10:42:46
てか>>8って毎度貼られるけど何なの?
part80くらいからしか見てないからわからん。
0023デフォルトの名無しさん2010/12/10(金) 11:31:41
>>22
かなり前に面白い流れだからって新スレを立てた人が次スレにも貼ったのが
始まりだったと記憶している
0024デフォルトの名無しさん2010/12/10(金) 12:52:49
過去ログを漁ってみた。

「STLつかうと〜」の初出が part16 (2003/02/21) で、 part17 にデジャブネタとして
コピペされたときにテンプレ指定され、隣接していた「C1010: プリコンパイル済みヘッダーの〜」の
くだりまでまとめて part18 で貼られ、その後長らくテンプレとして毎度貼られていた。
0025デフォルトの名無しさん2010/12/10(金) 12:56:44
同じように過去ログを、ぐぐるさんで調べてみた。
http://mimizun.com/2chlog/tech/pc2.2ch.net/tech/kako/1045/10457/1045746245.html
なんとか16を見つけたところだった。
0026デフォルトの名無しさん2010/12/10(金) 13:05:56
初代C++相談室のスレ建てが 2001/01/22 だった。
もうすぐ10周年になるようだ。
0027デフォルトの名無しさん2010/12/11(土) 12:58:14
wmain てマイクロソフトの拡張なんですか?
0028デフォルトの名無しさん2010/12/11(土) 16:47:55
はい
0029デフォルトの名無しさん2010/12/11(土) 20:01:50
整数型なんですけど、-1,0,1のようにある特定の範囲以外を代入しようとするとエラーを吐くような型(クラス)を作りたいのです
どうすればよいでしょう?
0030デフォルトの名無しさん2010/12/11(土) 20:10:30
クラスに Set用の関数とget用の関数つくるしかないんじゃね?
0031デフォルトの名無しさん2010/12/11(土) 20:14:11
class Int
{
public:
int operator =( int val ){ return this->val = val; }
private:
int val;
};

これでなんとかしろ
0032デフォルトの名無しさん2010/12/11(土) 20:17:32
operator int(){return val;}も必要じゃね?
0033デフォルトの名無しさん2010/12/11(土) 20:26:22
>>29 http://www.google.co.jp/search?q=constrained_value
0034デフォルトの名無しさん2010/12/11(土) 21:14:23
ttp://cpplover.blogspot.com/2010/12/stdsizet.html
sizeof演算子の戻り値の型は、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:46
>>34
The 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
inlineを付けると関数呼び出しのオーバーヘッドが減るらしいですね
でも、インラインと非インラインの関数の違いがイメージ出来ません

説明お願いします
0038デフォルトの名無しさん2010/12/11(土) 21:56:53
int i = 0;
++i;
これと
void increment(int& i) { ++i; }
int i = 0;
increment(i);
これ
どっちも同じことしてるけど後者の方が遅いっていうのは分かるよな?
それでinlineを付けるとコンパイル時に前者に置換されるわけだ
0039372010/12/11(土) 22:13:18
>>38
理解できました
ありがとうございます
0040デフォルトの名無しさん2010/12/11(土) 22:17:20
>>38
> どっちも同じことしてるけど後者の方が遅いっていうのは分かるよな?
わかんねーだろjk

37 も何納得してんだ。

アセンブリレベルのコードで比較しないと意味無い。
0041デフォルトの名無しさん2010/12/11(土) 22:18:43
>>40がアセンブリレベルのコード比較でinlineがどんなものか教えてくれるらしいぞ
0042デフォルトの名無しさん2010/12/11(土) 22:18:47
普通にわかったけど
0043デフォルトの名無しさん2010/12/11(土) 22:33:11
関数呼び出しがなくなる分
スタック積む?処理がなくなるから
オーバーヘッドがなくなるってことなんじゃないの?

C++ はじめてまだ15分ほどなんでよくわからないですけど。
Cは未経験です。
童貞って意味じゃないです。
いや、まぁ童貞なんですけどね。
0044デフォルトの名無しさん2010/12/11(土) 23:15:31
>>29
目指しているものと一致してるかはわからんが
演算子をオーバーロードして範囲チェックを行うやり方があるね
範囲そのものはポリシーで挿げ替えるという実装
オライリーの本だかに載ってたと思う
0045デフォルトの名無しさん2010/12/12(日) 00:44:41
>>36
ありがとうございます。
0046デフォルトの名無しさん2010/12/12(日) 01:14:03
>>39
おいおい安易に納得するな
inlineはregister指定と同じで、コンパイラはこれを無視する事が出来る
本当にインラインになっているかどうかは>>40の言う通りで逆アセンブル
画面を出して見てみないと分からないぞ
0047デフォルトの名無しさん2010/12/12(日) 01:15:04
だれもそういうことを聞いているんじゃないんだよね。
0048デフォルトの名無しさん2010/12/12(日) 02:03:42
>>38
これ見て後者が遅いと思い込むなんてのは、 for の中で変数宣言したら
遅くなるから外で(なんならグローバルで)とか言うのと同じような勘違いだ。
C++ 上の字面とパフォーマンスを直結させるべきじゃない。
0049デフォルトの名無しさん2010/12/12(日) 03:30:57
>>47
必ずinline展開されると思い込んでいる馬鹿もどうかと思うけどね
0050デフォルトの名無しさん2010/12/12(日) 03:43:34
誰がそんなこと言ってるんだ?
0051デフォルトの名無しさん2010/12/12(日) 10:20:09
現代のコンパイラは最適化の上ではinlineキーワードの有無をほぼ確実に無視する。
inlineはリンカに関数定義の重複を無視するように指示するものだと考えた方が
実用上は便利だ。
0052デフォルトの名無しさん2010/12/12(日) 10:48:55
inline展開の早くなる仕組みを聞いてるのに実際展開されるかどうかは別の問題なんだよね
0053デフォルトの名無しさん2010/12/12(日) 10:55:58
>>48
質問の意図を履き違えて関係ないことをべらべら喋り出すアホの典型
0054デフォルトの名無しさん2010/12/12(日) 13:47:58
class Super {
string &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
>>54
そもそもprotectedでないと派生からはm_strは使えない
それとなぜに参照?""で渡すと
一時オブジェクトが破棄されて存在しないものの参照が出来上がるんじゃないか?
0056542010/12/12(日) 14:11:20
>>55
結局、ダメってことですね
感謝
0057デフォルトの名無しさん2010/12/12(日) 14:12:20
class SubにSuper()ある
0058542010/12/12(日) 14:32:54
std::string &s = std::string("hellow");
って怒られるんだね
知らなかった
0059デフォルトの名無しさん2010/12/12(日) 14:54:14
コンパイルしてから聞けよ
0060デフォルトの名無しさん2010/12/12(日) 15:03:45
>>59
したよ
0061デフォルトの名無しさん2010/12/12(日) 15:05:44
const string&s なら一時変数も束縛できる、って知ってたよな
0062デフォルトの名無しさん2010/12/12(日) 15:22:52
これどこ間違ってるん?表示が滅茶苦茶なんだが

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) {};
};

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
>>46
そういえばコンパイラが無視していいものの中には volatile もあるな

>>51
単一定義規則は inline がついていても見逃してもらえないぞ
0064デフォルトの名無しさん2010/12/12(日) 16:05:40
>>62
class 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
>>64
なるほど、const参照のconst参照という風に2段以上に重ねると
問題が生じるようですね

これは盲点でした

これから気を付けます
ありがとうございました
0066デフォルトの名無しさん2010/12/12(日) 19:12:28
何を面白いことを言っているのだ。

Super s ( std::string("string") );

の時点でアウトなんだよ。
SuperとかSubとか書いてたり、仮想関数を知らなかったりするあたりJava使いだと思うんだが、
Javaの発想は全部捨てないとCやC++はぜんぜん挙動が違うぞ?
0067デフォルトの名無しさん2010/12/12(日) 20:11:51
>>63
volatile は無視しちゃいかんだろう。
inline で単一定義規則の制限が少し楽になるのは確かだろう。
0068デフォルトの名無しさん2010/12/12(日) 20:13:34
>>66
なんでアウトなんだよ
ただの一時オブジェクトじゃないか
それに今回は仮想関数は必要ないだろう
0069デフォルトの名無しさん2010/12/12(日) 20:15:28
>>68 >>62 の状態での話だろう。
0070デフォルトの名無しさん2010/12/12(日) 20:19:48
>>69
だから具体的にどうアウトなんだよ?
0071デフォルトの名無しさん2010/12/12(日) 20:21:56
>>70
一時オブジェクトを指して初期化された参照は、 Supuer の初期化が完了した時点ではすでに
無効になっている。 >>66 にある初期化の後、 s を使ったあらゆる操作が未定義動作になりうる。
0072デフォルトの名無しさん2010/12/12(日) 20:22:42
>>71
だからお前の言ってる事は>>64で全部書いてあるだろう
なぜ同じ事を二度も言うんだ?
0073デフォルトの名無しさん2010/12/12(日) 20:23:48
>>65 が「なるほど」とか言いながらさっぱり理解してないからだろう。
0074デフォルトの名無しさん2010/12/12(日) 20:26:07
>>73
どうして>>65が「さっぱり」理解してない事がお前にわかるんだ?
0075デフォルトの名無しさん2010/12/12(日) 20:29:46
>>74
65 が理解している問題発生の条件は「const参照のconst参照という風に2段以上に重ねると」
となっているが、実際には2段重ねなくたって同じ問題は発生する。

struct S { std::string const& s } s = { std::string("string") };
0076デフォルトの名無しさん2010/12/12(日) 20:30:44
>>75
だったら最初からそのようにシンプルに書けばいいだろう
ネチネチと厭らしいんだよてめえの書き方は
0077デフォルトの名無しさん2010/12/12(日) 20:32:34
>>75
だいたいコンパイルが通らないコードを書いてどうするつもりなんだよ?
0078デフォルトの名無しさん2010/12/12(日) 20:34:11
>>74 そうだな。すまんかった。
0079デフォルトの名無しさん2010/12/12(日) 20:35:30
>>77 そうだな。すまんかった。
#include <string>
struct S { std::string const& s; } s = { std::string("string") };
0080デフォルトの名無しさん2010/12/12(日) 20:38:27
>>79
「コンストラクタがありません」と言われますけど?
0081デフォルトの名無しさん2010/12/12(日) 20:44:01
>>80
codepad では通るようだが、環境は?
http://codepad.org/WVPBNYkZ
0082デフォルトの名無しさん2010/12/12(日) 20:49:11
>>81
BCC(ECC)6.3.1だ

エラーメッセージは「リファレンス メンバ 'S::s' があるクラスにコンストラクタがない」だ
当然だと思うが?
gccの拡張だろう
0083デフォルトの名無しさん2010/12/12(日) 20:51:31
>>62は継承とか使っているが、根本的に
一時オブジェクトと参照がどういうもかと言う基礎的ことを知らないってのが原因じゃね
恐らく、>>62はポインタ使ったのでも一時オブジェクトを気合を入れて指すコード書くんだろうな
0084デフォルトの名無しさん2010/12/12(日) 20:52:29
>>83
だからお前のは単なる憶測に過ぎないから
なんでそう自分の価値観を人に押しつける?
うぬぼれが強すぎるんと違うか?
0085デフォルトの名無しさん2010/12/12(日) 20:57:28
>>82
codepad は -std=c++98 -pedantic-errors だから gcc 拡張の線は薄いな。
http://codepad.org/about

暗黙宣言のデフォルトコンストラクタが使われれば暗黙定義で S::s が初期化されて
いないことが問題になるだろうが、この例では { ... } による初期化が行われているので
問題にならないほうが正しいと思う。
0086デフォルトの名無しさん2010/12/12(日) 21:10:40
>>85
§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
>>86
念のためにこれも付け加えておくか

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
>>86
いや、だからさ、それは暗黙定義のデフォルトコンストラクタで問題になるわけで、
>>79 では暗黙定義のデフォルトコンストラクタは使われていないから問題ないだろ。
0089デフォルトの名無しさん2010/12/12(日) 21:18:29
>>88
お前英語が読めないんだろう

the program is ill-formed.

の意味が分かるか?
リファレンスをメンバに持っていてそれがコンストラクタで初期化されない時は
そのプログラムは不適格とすると書いてあるだろう

つまりコンパイルが通らないので正しいわけだ
0090デフォルトの名無しさん2010/12/12(日) 21:21:53
>>87
それも関係ない。参照型メンバは初期化リストで初期化されなければコンパイルエラーに
なるから、当該のコンストラクタが実行されることもないし、もちろん完了することも無い。
0091デフォルトの名無しさん2010/12/12(日) 21:23:02
>>89
コンストラクタ定義の中で >>86 の条件に合えば ill-formed なんだよ。
>>79 では問題のコンストラクタ定義が無い。

何度言わせるんだ?お前は日本語が読めないのか?
0092デフォルトの名無しさん2010/12/12(日) 21:27:15
>>91
もう好きなようにしろ
規格を呈示しても難癖付ける奴にはもう言う事はないよ
自分独自の世界でプログラムでもしてろ
0093デフォルトの名無しさん2010/12/12(日) 21:31:22
>>92
規格を提示って言っても、関係ないところ提示されて話になるわけないだろ。
0094デフォルトの名無しさん2010/12/12(日) 21:32:40
最後に一つ
「英語が読めない奴はJIS規格でも読んでろ」
0095デフォルトの名無しさん2010/12/12(日) 21:35:47
英語の規格がちゃんと読めてもダメな人ってのはいるもんだな。
0096デフォルトの名無しさん2010/12/12(日) 21:43:03
>>81をVC2005でやったがコンパイル通った
よく分らんが、
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") }; はありえる?
0097662010/12/12(日) 21:44:53
こんばんわ。java厨のガラスのハートに傷をつけてしまいましたか?w

>なるほど、const参照のconst参照という風に2段以上に重ねる

これに対して「何を面白いことを」ですよ^^
>>64のいってることはあってますよ^^
0098デフォルトの名無しさん2010/12/12(日) 21:47:25
>>96
> {}あるからSはクラスじゃなくC的な構造体ととらえられてるんじゃない?
逆。 aggregate として扱われているから { ... } による初期化ができる。

> C++のstructはpublic class扱いのみで、データをまとめるC的structとしては扱えないの?
問題なく扱える。

> クラス扱いでs = { std::string("string") }; はありえる?
あり得る。


エラーが発生しているのは BCC(ECC) のバグ。
0099デフォルトの名無しさん2010/12/12(日) 22:06:01
参照メンバを持つクラスの集成体で初期化とかやったことないな
0100デフォルトの名無しさん2010/12/12(日) 22:32:19
参照メンバというのが実用上あまり使わない →過剰なポインタ嫌悪の権化
Cスタイルの初期化でコンストラクタとかもう聞いただけで汚らわしい
0101デフォルトの名無しさん2010/12/12(日) 22:39:15
集約の規則に参照型のデータメンバがあっちゃだめって規定はないから問題なし。
むしろ、ユーザー定義のコンストラクタがあるほうがだめ。
■ このスレッドは過去ログ倉庫に格納されています