[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 21:45 / Filesize : 205 KB / Number-of Response : 843
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part56



1 名前:デフォルトの名無しさん [2007/07/26(木) 00:33:07 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>2-15 付近参照

前スレ
class C++相談室lt;part56gt;
pc11.2ch.net/test/read.cgi/tech/1170343752/l50



220 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 03:22:10 ]
set_terminate ってどういう場合に使う?
main で全ての例外補足してから異常終了した方が
ローカル変数のデストラクタが呼ばれていいと思うんだけど。

221 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 03:24:59 ]
そういうまともな例外処理が出来ないときのためにあるのでは

例外処理中に例外が出たとか

222 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 03:27:03 ]
>>220
2行目以降の意味がわからん。 set_terminate() 関係ないだろ。

223 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 03:36:23 ]
>>221
ああ、二重例外に対応する場合か。なるほど。

224 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 12:41:24 ]
VS2005 MFCなんだけど、アクセスバイオレーションの例外処理を
捕らえたいんだけど、
try{}
catch( ... ){}
この構文では捕えられないんだけど、どうしたらいい?


225 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 12:44:09 ]
アクセスバイオレーションて単純にソフトウェアのバグじゃないか?w

226 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 12:54:51 ]
/EHaとか/EHcがらみじゃないの?

でもデフォルトから変更した場合、
ミドルウェアとか依存するライブラリ絡みの整合性が心配だな。

227 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:14:37 ]
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndeepc/htm/deep060399.asp
まあC++の範疇じゃないな。

228 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 06:55:48 ]
構造化例外で捕まえた方が良いと思うヨ。



229 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 18:19:11 ]
_set_se_translatorという手もある。
いずれにせよVC++くらいしか使えるものがないというのに変わりはないけどな。

230 名前:デフォルトの名無しさん [2007/08/06(月) 21:25:46 ]

スレ違いだったらすいません。

アプリ開発の依頼スレが見つからなかったのでこちらに書かせて頂きました。
当方所有のウェブアプリケーションソフト
(以前プログラマに依頼して作ってもらったものですが今は連絡が取れません)
がURL先の変更?で突然使えなくなってしまいました。

そこで、緊急で本日中に改変が出来そうな方是非お願いできないでしょうか?
当方、全くの知識不足で言語が C++ということ以外分かりません。
ソースファイルは持っております。料金は2万円でお願いします!

seishinkeiki@hotmail.co.jp

231 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 21:29:58 ]
マルチはよくないな

232 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 21:47:57 ]
やすっ

233 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:11:47 ]
>>230
ソースがあるならソースを晒せよ。ロハでできるぞ。
ソースを晒せないから有料でということなら、2万円なんて人を見下したようなことをするもんじゃない。

234 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 06:33:04 ]
void foo(char *p, size_t len)
{

}

235 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 06:34:28 ]
すみません途中で送信してしまいました。

void foo(char *p, size_t len)
{
// ここでpとlenからistreamを作りたい
}

実際には、basic_istreamの派生クラスを作るしかないのでしょうか?

236 名前:235 mailto:sage [2007/08/07(火) 06:44:00 ]
最初は、std::istringstreamを使って実装していたのですが、バイナリを扱う必要があるので、見送りました。

237 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 07:39:56 ]
俺判定

↓エスパー1級

238 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 07:48:18 ]
>>236
ファイルストリーム以外でバイナリとテキストの問題なんて起こらないだろ?
istringstream でいいと思うよ。



239 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 07:50:42 ]
>>236
なんでバイナリを扱う必要があったら istringstream を見送るの?

240 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 09:01:36 ]
stringという名前が付いてるからバイナリは扱えないと思っているんだろうな

241 名前:デフォルトの名無しさん mailto:sage [2007/08/08(水) 20:13:23 ]
義務教育もしっかり受けてるのに
x = x +1
が疑問でもなんでもない俺は負け組

242 名前:デフォルトの名無しさん mailto:sage [2007/08/08(水) 20:15:25 ]
柔軟な思考は大事
固定観念はよくない

243 名前:デフォルトの名無しさん mailto:sage [2007/08/08(水) 21:16:13 ]
もう疑問を持ったかどうかすら覚えてないわ

244 名前:デフォルトの名無しさん mailto:sage [2007/08/08(水) 21:57:28 ]
>>241
x = x * x + Cならマンデルブロ集合なんだけどね。

245 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 10:46:54 ]
>>241
むしろそのへんの切り替えが高速にできない子は算数のできない子

246 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 19:51:16 ]
リアル演算子オーバーロードだよな。

247 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 19:59:43 ]
要は「今まで習った常識・ルール」に囚われてしまっていて、
新しいルール、新しい前提の上でのゲームには一歩も踏み出せないってことだからな

その程度の頭の柔軟性が無いのでは算数やプログラミングに限らず
何やってもだめ

248 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 09:40:31 ]
何でも受け入れるのもあれだけどな。
そこに疑問を持ち、考察し、納得する、というプロセスをだな・・・



249 名前:身の程知らず mailto:sage [2007/08/10(金) 12:01:33 ]
C++の文法に疑問を持つのは、よほどの天才か身の程知らずのどちらかだろ。
もちろんもっと人間にもコンパイラにも分かりやすくて、すばらしい文法は作れただろうが、
今のような位置を占めているかどうかは疑問だ。


以下、俺様演算子を定義できる機能とか、
Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
↓禿のお気に入りだったマルチメソッドなどについて語ろう↓

250 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 12:04:48 ]
>以下、俺様演算子を定義できる機能とか、
演算子オーバロードではお気に召しませんか?

>Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
C99のプリプロセッサではお気に召しませんか?

それならDをどうぞ。

251 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 12:06:05 ]
Lispじゃねぇの

252 名前:デフォルトの名無しさん [2007/08/10(金) 12:10:18 ]
開発当時はのんびり言語仕様考えるヒマなかったんだろう。
シェア争いを制するために時間を惜しんだんだろ
結局当時は高級言語に負けたが。

253 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 12:11:29 ]
俺様演算子っていうと、Prolog みたいなやつか。

254 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 14:42:56 ]
俺様演算子っていうと、Haskell みたいなやつか。

255 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 14:58:06 ]
Forth なら何でもありだな

256 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 15:05:03 ]
禿は演算子オーバーロードは必要最小限に抑えたほうが良いと言ってなかったか

257 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 15:54:28 ]
おまいは禿が死ねって言ったら死ぬのか?

258 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 16:32:06 ]
詭弁のガイドライン



259 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 17:05:23 ]
おまいは「おまいは禿が死ねって言ったら死ぬのか?」ってレスを見たら詭弁だと短絡的に思うのか?

260 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 17:07:20 ]
次の相談者の方、どうぞ↓

261 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 17:10:30 ]
禿はC++に関しての第一人者だけど、死に関しての第一人者じゃない。
詭弁じゃないと言うなら、何をもって
「禿は演算子オーバーロードは必要最小限に抑えたほうが良いと言ってなかったか」
「おまいは禿が死ねって言ったら死ぬのか?」
というのが同じ重みがあるとするのかを明確化しろ。


262 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 17:44:52 ]
物事の良し悪しは他人任せにせずに自分で考えましょう、
と注意する場合の定型句だと思うが。

263 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 18:16:58 ]
ならそう書けばいいんじゃないかなw

264 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 18:21:40 ]
なんでも平たく書き下すんじゃなく、
慣用句等あれば使うのが文化って奴だろ
その点APLなんかすごいぞ

265 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 18:26:07 ]
論点ずらしの天才

266 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 18:34:21 ]
演算子と人の生死を結びつけるところが正直よく分からん

267 名前:身の程知らず mailto:sage [2007/08/10(金) 18:45:10 ]
禿があれほどD&Eで多くのページを割いて、規格に入らなかったことを悔しがっているのに、
一言も突っ込まれないマルチメソッド哀れ。

まあ、正直言ってまず使わないと思うけど。

268 名前:デフォルトの名無しさん mailto:sage [2007/08/10(金) 19:05:50 ]
(動的)マルチメソッドマジ欲しい。
Lokiにもマルチディスパッチの実装あるけど、さすがに面倒だ。
でも、コンパイラの実装大変そうだよね。

演算子オーバーロードはPEGとかEBNFを実装するためにあると思うんだ。



269 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 12:00:15 ]
質問があります。
class A
class B
class C
があるとして、class Cをclass AとBのメンバに持たす時、
class AとBのインスタンスを複数作った場合、メンバであるclass Cも
複数作成されてしまうと思います。
そこで、classA、B共に一つずつしかclass Cを作らないようにしたいのですが、
こういう場合はstaticメンバ変数にするしかないのでしょうか?
ていうのも、static変数はクラス外に宣言を書かないといけないためclass A,Bみたいなクラスを
たくさん作ると大変なんですよね・・・。
class A,Bの基底クラスに持たすことはできませんし・・・

良い方法があればご教授ください。

270 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 12:27:32 ]
つ 静的局所変数

271 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 12:45:41 ]
>>269
CRTP が使える場面かもしれない。
でも、そんなに静的変数が要るのかどうかが疑わしい。
クラス外に定義が必要なのが嫌だというのも理解しかねる。

272 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 16:51:02 ]
template<UINT nID>.
class Base
{
 static C s_c;
};
template<UINT nID>
C Base<nID>::s_c;

class A : public Base<0>
{};
class B : public Base<1>
{};


273 名前:269 mailto:sage [2007/08/11(土) 19:13:13 ]
>>270-272
返事が遅れてしまい申し訳ありませんでした。
レスありがとうございます。

CRTPってデザインパターンの一種みたいですね。
>>272のソースがCRTPなのでしょうか?
面白そうなので試してしみようと思います。

274 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 19:43:47 ]
それは全然違う。
CRTPはベースクラスが、継承クラスの型を知ること

275 名前:269 mailto:sage [2007/08/11(土) 19:55:41 ]
>>274
なるほど。どもです。
ちょっとググって来ます。

276 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 23:40:11 ]
CRTPてこんなの

   template<class derived_t>
   class TLogPolicy {
   public:
      void log() { log_ += (static_cast<derived_t*>(this))->data_ + "\n"; };
   protected:
      TLogPolicy() {};
   private:
      std::string log_;
   };
   class TManager : public TLogPolicy<TManager> {
   public:
      void test() { log(); };
   private:
      std::string data_;
      friend TLogPolicy<TManager>;
   };

けっこう有名なテクニックだとおもうけど?


277 名前:269 mailto:sage [2007/08/12(日) 02:50:34 ]
>>276
ありがとうございます。
まだ、実装はしてませんが、>>276さんのソースを弄った感じ私が求めてたモノかもしれませんw
ただ、1行目のtemplate<class derived_t>って言うのがよく分からないのですがなんなのでしょうか??

278 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 03:00:57 ]
>>277
ごく普通のテンプレート宣言だよ。これぐらいは調べてくれ。



279 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 03:03:18 ]
>>278
あ、なるほど、template<class T>みたいなもんですかw
てっきり、特殊なことやってるのかと思いましたw
すいません。

280 名前:269 mailto:sage [2007/08/12(日) 15:09:02 ]
また、質問させていただきたいのですが、>>276さんのソースを簡易化して、
template<class derived_t>
class TLogPolicy {}
class TManager : public TLogPolicy<TManager> {};
class UManager : public TLogPolicy<UManager> {};
class Cont {
std::list<TLogPolicy *> cont;
template <class derived_t>
void add(TLogPolicy<derived_t> *hoge) {
cont.push_back(hoge);
}
};
として、TManager,UManagerのインスタンスを複数作り、
Contクラスのcontに格納したいのですがどうすればいいのでしょうか?
とりあえず、1つのコンテナで管理したいのです。
実際、追加しようとすると、変換できないなどとエラーがでます。
TManagerの適当なメンバ関数から、Cont::add<TManager>(this);
よろしくお願いします。

281 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 15:15:38 ]
>>280
コンテナに入れたいだけならもういっこ基底クラスを置くだけでいいだろう。
コンテナの要素に対して何をしたいのかによっては、それじゃ不満だろうが。

ソース貼るなら、ちゃんと問題(エラー)が再現できるコード作れよ。

282 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 15:50:20 ]
どうもtemplateとclassの関係を判っていないようだな。
テンプレートのポインタ(TLogPolicy *)なんてのは無いよ。

TLogPolicy<TManager>とTLogPolicy<UManager> は別の型だから、
同じ基底クラスとして扱うことは出来無いし。

面倒だから簡単にboost::anyのコンテナ使う手もあるかね。

283 名前:269 mailto:sage [2007/08/12(日) 19:54:07 ]
>>281-282
レスありがとうございます。

>ソース貼るなら、ちゃんと問題(エラー)が再現できるコード作れよ。
申し訳ありません。以後気を付けます。

templateとclassの関係などもうちょっと勉強し、
レスを参考に少し考えてみることにします。

284 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 23:02:30 ]
>>283
多分コンパイル通そうと尋常じゃない時間を割くと思われるので一つ教えてあげる。

テンプレート関数はこう書く。
template <class T> void foo( T param ) { ... }
テンプレートクラスはこう書く。
template <class T> class bar { T member; };

しかし、クラスにテンプレートの関数(これをメンバテンプレートという)
を書くことはできない。

class hoge {
  template <class T> void f( T param ) { ... } // ←コンパイルエラー
}

つまり 280 のコードでやろうとしていることは、そもそも不可能なんだよ。

285 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 23:16:39 ]
>>284
メンバテンプレートって呼び名が付いてるのに書くことはできないんだ。ふーん。
コンパイラ何使ってるの?

286 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 23:19:40 ]
たしかVC5か6かなんかでは出来なかっただけ。

287 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 23:45:41 ]
vc6 では出来る。
が、一部文法が通らないな。

hoge h;
h.f(1); // OK
h.f<float>(1); // NG

vc5 は知らん。

288 名前:284 mailto:sage [2007/08/12(日) 23:46:09 ]
あ゛ぅ、手元のコンパイラでやってみたらできた・・・
>>283 すまん、284 は全くのマチガイ。忘れてくれ m(_ _)m

>>285 VC2005。
>>286 今試したら VC6 ではできた。VC 5 以前はわからんけど。

いぢめないで。。。



289 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 23:59:00 ]
ちょっと興味が湧いたので実装してみた。

   template<class derived_t>
   class TClassData {
   private:
      template<typename T>
      string& data(T* t) {
         static string data;
         return data;
      }
      friend derived_t;
   };

   class TManager : TClassData<TManager> {
   public:
      void set(string const& s) { data(this) = s; };
      string& get() { return data(this); };
   };

…………しかし、継承使われたりすると危なっかしくてしょうがないな。
TManagerはクラス内クラスにしてファイナル化しといた方が安全そうだ。

290 名前:289 mailto:sage [2007/08/13(月) 00:01:46 ]
というよりもVC5,6はステだろ。
未だに保守でVC5,6使わされているプログラマは可哀想でしょうがない。

291 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 00:03:03 ]
class TLogPolicy { public: void foo() { ::std::cout << "Hello"; } };
class AbstractTLogPolicyHolder { public:
TLogPolicy& policy;
AbstractTLogPolicyHolder( TLogPolicy& policy ) : policy( policy ) {}
};
template < class T >
class TLogPolicyHolder : public AbstractTLogPolicyHolder {
static TLogPolicy policy;
public: TLogPolicyHolder() : AbstractTLogPolicyHolder( policy ) {}
};
template <class T> TLogPolicy TLogPolicyHolder<T>::policy;
class Cont { ::std::list< AbstractTLogPolicyHolder* > cont;
public: void add( AbstractTLogPolicyHolder* holder ) { this->cont.push_back( holder ); }
void callAllFoo();
};
void Cont::callAllFoo() {
::std::list< AbstractTLogPolicyHolder* >::iterator i = this->cont.begin();
for( ; i != this->cont.end(); ++i ) { ( *i )->policy.foo(); }
}
class TManager : public TLogPolicyHolder< TManager > {};
class UManager : public TLogPolicyHolder< UManager > {};

void main() {
Cont cont;
TManager t1, t2, t3; // TManager::policy は 1 個だけ存在
UManager u1, u2, u3; // UManager::policy も 1 個だけ存在

cont.add( &t1 );
}

292 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 00:05:41 ]
>>290
この前、VC3の案件が回ってきて笑った。

293 名前:289 mailto:sage [2007/08/13(月) 00:15:30 ]
うわ……ありゃc++とは言えないだろう……


良く良く考えたらテンプレートメンバ関数要らんな。
ただ危険にしているだけだった。
   template<class derived_t>
   class TClassData {
   protected:
      TClassData() {};
      string& data() {
         static string data;
         return data;
      }
   };
   class TManager : public TClassData<TManager> {
   public:
      void set(string const& s) { data() = s; };
      string& get() { return data(); };
   };

294 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 08:35:29 ]
>>293
TLogPolicyとContはどこいった?

295 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 11:17:36 ]
規格読んでたらよく分かんなくなってきた。

std::complex<double> c = std::complex<double>(1, 2);

とした時、コピーコンストラクタが呼ばれるかどうかに関する規定がよく分からない。

これは「コピー初期化」であって「std::complex<double>(1, 2)がcにコピーされる」らしいんだが、
実際やってみると、どうもコピーコンストラクタは呼ばれない。
この「コピー」というのがコピーコンストラクタを呼ぶことを意味していないのか、
それともコピーコンストラクタを呼ばない最適化が規格で許されてるのか、
どうもよく分からない。

このあたりどうなってるのか詳しく知ってる人はいる?

296 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 11:22:35 ]
>>295
ttp://www.kmonos.net/alang/cpp/glossary.html#RVO

297 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 11:27:38 ]
1)T a = T(...)
2)T a(...)
は同じじゃなかったっけ


298 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 11:45:31 ]
>>295
つまり、これも戻り値最適化に含まれる、というわけ?



299 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:05:27 ]
>>297
いいえ。前者はコピーコンストラクタが呼ばれる可能性があります。
# >296参照。

300 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:06:17 ]
>>298
正しく、RVOですね。

301 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:07:59 ]
規格には何箇所かコピーコンストラクタの省略を許す箇所が挙げられている。
戻り値最適化もコピー初期化時の省略もそのひとつ。

って、他にあったっけ?

302 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:09:56 ]
>>300-301
これで安心して眠れます。
まだ寝ないけど。

303 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:10:44 ]
>>295
これかしらん?

web.archive.org/web/20050308020505/www.kuzbass.ru/docs/isocpp/special.html
ここの最後の方

> -15- Whenever a temporary class object is copied using a copy constructor, and this object and the copy have the same cv-unqualified type,
an implementation is permitted to treat the original and the copy as two different ways of referring to the same object and not perform a copy at all,
even if the class copy constructor or destructor have side effects.

304 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:22:55 ]
>>303
おおー。それですね。完璧ですね。

305 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:31:03 ]
規格 8.5.14 内のここは?

if the function is a constructor, the call initializes a temporary of the
destination type. The result of the call (which is the temporary for the
constructor case) is then used to direct-initialize, according to the rules above,
the object that is the destination of the copy-initialization. In certain cases,
an implementation is permitted to eliminate the copying inherent in this
direct-initialization by constructing the intermediate result directly into the
object being initialized;


306 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 13:07:44 ]
>299
ええ? >297の通りじゃ……と思ってC++STDを確認しました。
8.5 Initializers
(snip)
initializer:
  = initializer-clause
  ( expression-list )
initializer-clause:
  assignment-expression
  { initializer-list ,opt }
  { }
initializer-list:
  initializer-clause
  initializer-list , initializer-clause
ということで、>297の通りじゃね?良くわからないけど。

307 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 13:12:39 ]
>>306
「ということで」じゃねーよ。何を確認したんだよ。

= に続けて置かれた初期値の型が同じなら、動作上は direct-initialization と
同じに最適化されるが、意味上は依然として copy-initialization なので、
たとえばコピーコンストラクタが private になってたりすると >>297 の 1 は
コンパイルエラーになる。

308 名前:306 mailto:sage [2007/08/13(月) 14:06:53 ]
あれ?そうだっけ? ということでもうちょっと調べてみました。
過去ログにあった。
ir9.jp/prog/ayu/datlog/tech_cpp/1047560042/1047560042_03.html#R700
条件付きで同じになるっつうのが正解かしらん?

copy-initializationとdirect-initializationについて纏まっている資料は無いのかね?
More Exceptional C++に載っているみたいだけど……




309 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 14:56:26 ]
ためになるなあ

310 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 01:11:10 ]
おもしろいな、copy constructorへのaccess checkがかかるけど、
実際にはdirect-initializationが行われる(よばれる)のか

class Nurupo
{
private:
//public:
 Nurupo(const Nurupo&) {
  *(int*)0 = 0;
 }
public:
 Nurupo(int nurupo1, int nurupo2, int nurupo3) {
  ;
}
};

void foo() {
 Nurupo nurupo = Nurupo(1,2,3);
}

private:だとコンパイルエラーになるが、
public:にして実行しても落ちるわけではない

でさ、これもRVOって呼ぶの?returnしてないのに?

311 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 01:53:47 ]
>>310
これは RVO とは呼ばない。

312 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 01:55:03 ]
>>308
規格のドラフトでいいんじゃないの? >>2

313 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 02:39:08 ]
JIS に行けばドラフトじゃなくてちゃんとしたのを一応読める。色々と不便ではあるけど。

314 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 02:45:47 ]
日本の未来に絶望する配布形式


315 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 08:29:54 ]
不要なものは使いにくくなっている
C++的には正しい配布形式

316 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 10:19:47 ]
const int i[10];
という配列をメンバーに持っていた場合、どうやって初期化すればよいのでしょうか? 


317 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 10:21:52 ]
>>316
できません。 const 外すか、パフォーマンスに問題なければ std::vector を使うか。

318 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 10:23:08 ]
int i[10]; という配列をメンバーに持つクラス X を作って、
const X x; として、その x のコンストラクタで初期化する。



319 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 10:40:09 ]
残念ながらコンストラクタ内で代入することになるね。

320 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:11:20 ]
ご意見伺いたいです。

C++にてシングルトンを実装するに当たって、インスタンスの解放を明示的に実装しますか?

私は、実装します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。

実装しないという人の理由が、解放される順番が難しい、
というのですがそれは理由にはならないのではと。

解放しない派で、もっとこう積極的な理由があるなら教えてください。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<205KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef