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


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

C++相談室 part122



1 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 23:06:15.32 ID:HdItgJjm.net]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part121
peace.2ch.net/test/read.cgi/tech/1449240881/


このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.97【環境依存OK】
peace.2ch.net/test/read.cgi/tech/1439849418/

次期規格C++1zはこちら
C++14/C++1z 20
peace.2ch.net/test/read.cgi/tech/1410382924/

■長いソースを貼るときはここへ。■
 codepad.org/
 ideone.com/

237 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 03:14:53.57 ID:HpDJFp9+.net]
>>233>>234
漏れは慎重に「std::vector::push_back()呼び出し時点での」と限定して書いたで?

238 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 05:43:02.21 ID:VhIzDspW.net]
>>237
ん?だから何?
push_back() 関数内での領域確保・実行時間を減らして、それらを push_back() の
直前の処理に移動することに何か意味があるとでもいうの?それはどんな場合にうれしいの?

239 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 05:59:47.15 ID:GfziY506.net]
A「意味がないわけではない」
 「〜される」
B「そんなことは ない」
A「そんなこと ある だろ」
B「だから何?〜だと何かいいことあるのか?」

>>232の2つの文のどちらについて話をしているのかの認識がずれていることに気付かない低能どもの会話は滑稽だな

240 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 06:17:44.28 ID:GfziY506.net]
やっぱり馬鹿にC++は無理だな
メモリ確保のnew/deleteは禁止にしてスマポとコンテナーだけ使っとけ
ついでに馬鹿はshared_ptrも使用禁止にしといた方が安全

241 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 11:02:01.65 ID:u8r8Wxi4.net]
> v.reserve(v.size() + 1);
> v.push_back(new Fuck);

やっぱり馬鹿にC++は無理だなw
push_backの直前で+1サイズのreserveとかw

www.cplusplus.com/reference/vector/vector/reserve/
ここのExampleみてお勉強しなおしたら?
例外投げるのも書いてくれるから学んどけよ

242 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 11:46:11.52 ID:GfziY506.net]
初回がresize前のcapacityと比較して何が言いたいのかよくわからん例だな

push_backはcapacityに余裕が有るときに再アロケーションしないことは保証されているが
例外を出さない保証は23.3.6.5から読みとれないな
やはり馬鹿にはスマポを強制したほうがいい

243 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 13:13:55.69 ID:VK1fBsAo.net]
>>238
reserve()とpush_back()のどちらで例外が発生するかという文脈において、
>>227のreserve()がpush_back()の直前行であるという解釈は一体…

まあv.reserve(v.size() + n);ならともかく、v.reserve(v.size() + 1);だったから気持ちはわからんでもない

244 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 14:18:45.97 ID:GfziY506.net]
どうみても>>227はpush_back(というかnew)の直前にしか見えないのに
何を言ってるんだお前は

245 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 15:00:28.25 ID:9j1RlcoP.net]
挿入前に拡張しておけという有難い教えだな。



246 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 16:17:33.41 ID:GfziY506.net]
>>245
挿入前に拡張すると(要素のコンストラクター以外では)例外が出ないという保証はある?

247 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 16:22:43.98 ID:AurOqJPw.net]
>>245 はC++とは違う話題かと。
Cとなら関係あるかも知れないが、プログラミング言語でないC。

もちろん俺の読み違いかもしれない。

248 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 16:27:26.60 ID:7MlWNObS.net]
あと一個で例外が飛ぶようなメモリ状況で

☆一行のとき
v.push_back(foo); // ここで例外

☆二行のとき
v.reserve(v.size() + 1); // ここで例外
v.push_back(foo);

こうなるだけじゃないの?
新たな連続した一本のメモリが確保できないと例外なんだから

249 名前:デフォルトの名無しさん mailto:sage [2016/01/30(土) 16:35:52.43 ID:lYkNZO2m.net]
>>246
規格を読んだ限り保証はされてないね
現実に存在する実装ではreserve済みであれば生ポのpush_backじゃ例外発生しないだろうけどね
そんなことはアテにしちゃいけない

250 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 01:01:58.63 ID:CuJD672c.net]
reserveで例外かわせても、次のnewによるメモリ確保で例外になる可能性はなくならないのだから、
newを一旦別の変数で受けるしかないでしょ

hoge h;

h = new hoge;
vec.push_back(h);

が正解。

251 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 01:58:17.63 ID:fnCrDph6.net]
いやいやwもういいからスマポをmake_uniqueとかmake_sharedで使っておけ
バカはnewを書くな!

252 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 02:09:31.02 ID:CuJD672c.net]
>>251
あんたバカバカ言ってるけどnewを使うかmake_sharedを使うかはこの問題の本質じゃないから。
馬鹿じゃないならわかるよね?

253 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 02:22:38.94 ID:dRJvSEmL.net]
どうなんだろうね
vec.push_back( new t() )
の場合、newで例外が発生したらpush_backは実行しないんだから関係ないと思うんだが
push_back呼ぶ前の、スタックに引数を積む段階で例外が発生するわけだから
push_backは呼ばれもしないし、全く関係ないと思うんだが

254 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 02:25:49.77 ID:fnCrDph6.net]
>>252
あなたが問題の本質を理解してると思えないが?
newを変数で受けたってなにも変わりはしないよ
てか、まずはhoge* hにしてから言ってくれない?

255 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 05:14:31.96 ID:yDMVnQCY.net]
java厨ってnewしたままホウチミンだよね



256 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 06:43:17.15 ID:JTo/Q0C3.net]
>>250>>253のような
C++の教科書にある間違ったコードのテンプレのような糞コードを真顔で言い出す低能を見ると
やはり馬鹿にはスマポとしか言いようがない

257 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 17:11:12.73 ID:Ev74Df4F.net]
そのjava厨が何を指すのか曖昧だが
Javaでは普通、ネイティブリソースはRAIIで開放するぞ

258 名前:デフォルトの名無しさん [2016/02/01(月) 17:14:07.57 ID:/UrjTotH.net]
ジャバってデストラクタみたいなの追加さらた?

259 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 17:59:52.82 ID:fnCrDph6.net]
JavaでRAIIとかもうわけがわかんねーな異世界に飛ばされたような感覚だよ

260 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 18:03:33.95 ID:JTo/Q0C3.net]
確かにJavaのRAIIはCloseableとAutoCloseableの違いを理解してないと正しく使いこなせないからな
>>259のオツムがフットーしてしまうのも致し方ない

261 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 19:47:56.26 ID:FCPkKuCG.net]
C++に移ってきたjava厨だよ
newしたままdeleteしねぇ糞ソース大量生成しやがる

262 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 20:09:02.04 ID:qjT3Q9+K.net]
>>261
Java厨は犬派で、C++厨は猫派だからな
newと鳴いたら、deleteるからな

263 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 20:24:37.67 ID:ZBzDFClp.net]
>>262
こういう喩え話って、短い文章中に多くの情報が込められてるものだが。

無粋を承知でお願いします。解説してください。

264 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 20:42:15.43 ID:aUqGS129.net]
>>261
Java 厨に生ポなんて使わせるお前が狂ってる

265 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 20:46:33.11 ID:qjT3Q9+K.net]
>>263
深い意味は無いよ
C/C++やるときはnewしたらdeleteせよ!って鉄則でしょ
ニャー(new)と鳴いたら、必ずデレてる(deleteる)からC++厨は猫派
単なるダジャレだよw



266 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 20:51:56.51 ID:JTo/Q0C3.net]
>newしたらdeleteせよ!って鉄則でしょ

低能のお前にはわからないかも知れないが
そんなことはない

267 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 21:00:17.78 ID:fOHJkiXU.net]
猫は飯くれと撫でろしか言わない
自分が人間より上だと思ってるのでデレることはない

268 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 21:32:50.64 ID:JTo/Q0C3.net]
>>264
ジャバ厨とレッテルを貼るのではなく、たまたまソイツが低能だからということに気付くべき
Javaでもリソース開放は行うし、C++スレにも>>250,>>252,>>253のようなメモリも開放できない奴もいる

269 名前:デフォルトの名無しさん [2016/02/01(月) 21:42:26.29 ID:BsHDgmsO.net]
生ポってどんな場面で使うの?

270 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 22:07:54.53 ID:wHu9vKIt.net]
>>268
低脳な Java 使いだから Java 厨ってラベル貼られてることに気づくべき

271 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 22:57:12.27 ID:47CQ9v48.net]
>>269
ツリー構造で子が親へ参照を持つときに使ったことがあるな
相互参照するけど、親の寿命管理が必要が無いのでshared/weak_ptrが不要なケース
↓こんな感じ
class tree_view
{
tree_view *parent;
vector<unique_ptr<tree_view>> children;
};

272 名前:デフォルトの名無しさん [2016/02/01(月) 23:10:37.79 ID:BsHDgmsO.net]
>>271
deleteの出番なしか

273 名前:デフォルトの名無しさん mailto:sage [2016/02/01(月) 23:55:10.43 ID:CuJD672c.net]
>>268
だったら模範解答貼ってみせろよクズ

274 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 00:06:14.39 ID:ygGmQV70.net]
>>273 >>231

275 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 00:14:57.63 ID:oBfAWjKR.net]
>>271
子を作り管理するのは親ですか?



276 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 00:50:11.96 ID:AUeQZlYi.net]
生ポ渡しするなら生成するのは普通は親でも子でもなくファクトリだと思う

277 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 00:59:22.35 ID:AUeQZlYi.net]
生ポ渡しってただただ生ポ渡すってだけの意味な
こう書いとかないと馬鹿には使えないが口癖のボットに絡まれそうだし一応書いとくわ

278 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 01:25:45.50 ID:x5amnXbs.net]
>>260
へえJavaにもRAIIの概念なんてあったんだ
Javaな現場になんてもう何年も関わってないんで知らんかったわ

279 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 01:37:28.22 ID:r5dd6eSW.net]
沖林正紀の悲劇を繰り返すな

280 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 03:58:43.22 ID:uTTEQY4N.net]
罵倒してるやつの態度は悪いけど
例だろうとポインタ間違えた上に
今時newしてvectorにpush_backしちゃうようなコード書いて
その上逆ギレしちゃう奴は正直ダメだと思う

281 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 06:45:21.02 ID:5quLb8ti.net]
質問です。
ideone.com/QRZXDk
上の21行目の再解釈キャストで型変換してるところってVCでは意図したとおりに動いたのですが、
これって他の環境でも大丈夫ですか?

282 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 07:52:12.29 ID:Vw/b/5l0.net]
配列a[10]で&a==&a[0]となる理由がわかりません。
おしえてください。
&a[0]はaの要素の1番目の番地で&aはaの1番目の要素を
指し示すアドレスのアドレスの気がするからです。

283 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 07:59:56.34 ID:N9T32bdW.net]
アドレスのアドレスなんてものは無いということに気がつけばまぁそんなもんかと理解できるかと
(ポインタ変数のアドレスならある)

284 名前:デフォルトの名無しさん [2016/02/02(火) 09:42:40.95 ID:LvBWX7cX.net]
例外機能をoffにした場合
std::vector<int> v(???);
でメモリの確保に失敗した場合の動作はどうなりますか

285 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:14:27.48 ID:NoB4axe7.net]
"自動車"クラスを"人間"クラスが操作するとします。

"自動車"クラスが提供する個々の機能(例えばアクセルやブレーキ)は、
サブクラスが提供(例えばアクセルはエンジンクラスに定義)して、
"自動車"クラスは特に関与しないものとします。

この前提において"自動車"クラスを定義する場合、"自動車"クラスは
サブクラスを継承するかたちで定義したほうが良いでしょうか?
それとも、自動車クラスが個々のサブクラスのインスタンスを保持して
メソッドをラップしたほうが良いでしょうか?



286 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:22:39.18 ID:ygGmQV70.net]
>>281
継承を確信できるところでのダウンキャストは static_cast の出番。 5.2.9 [expr.static.cast] p2
reinterpret_cast で作った結果に移植性があるのはごく一部だけ。 5.2.10 [expr.reinterpret.cast]

287 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:22:52.91 ID:MIlHcyxr.net]
人とエンジンは特性上車とは異質であるが為継承ではなくラップした方が融通性能高いことは明白である

288 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:23:10.07 ID:ygGmQV70.net]
>>282
いいかげんな教材には a が「配列先頭要素へのポインタである」などと
書いてあるかもしれないが、実際には「配列」であり一部の例外を除いて
「配列先頭要素へのポインタに暗黙変換される」ということになっている。
& 演算子は例外のひとつで、 &a で配列そのものへのポインタが得られる。
4 [conv] p8

289 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:23:22.64 ID:ygGmQV70.net]
>>284
非標準の動作なので、まずコンパイラのマニュアルを調べる。
書いてなければ、どうせ移植性は期待できないので実験でもいいかもしれない。

290 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:24:45.55 ID:ygGmQV70.net]
>>285
https://www.google.co.jp/search?q=is-a+has-a

291 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 11:30:10.28 ID:NTv/QStd.net]
>>285
当然後者。
現実の関係を模倣するのが普通。

一点、ラップってのをどういう意図で使っているのかが気になる。
個々の部品を組み合わせて、車としての機能を提供すると考えてね。
部品の機能をスルーするだけのラッパーはあまり出ないはず。

292 名前:285 mailto:sage [2016/02/02(火) 11:53:42.81 ID:NoB4axe7.net]
皆さん、回答ありがとうございました。

継承と包含の関係を理解してませんでした。
ちなみに”サブクラス”という言葉の使い方も誤解してたみたいです(^^;

>>291
>ラップってのをどういう意図で使っている

部品の機能をスルーするだけのラッパーという意味でした (^^;

その辺も含めてもう少し設計を見直したいと思います。

293 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 13:09:09.90 ID:ZM61xwKS.net]
未だbetter Cより進んだ使い方ができない

294 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 13:26:24.18 ID:7f7wf/mW.net]
>>284
俺の環境だと、色々省略すれば
std::vector : protected std::_Vector_base {
vector(size_type __n, const allocator_type& __a = allocator_type()) : _Vector_base(__n, __a) { _M_default_initialize(__n); }
};
std::_Vector_base {
_Vector_base(size_t __n, const allocator_type& __a) { _M_create_storage(__n); }
};
となって、最終的に__gnu_cxx::__alloc_traits<_Alloc>::rebind<_Tp>::other::allocate() defined at ext/new_allocator.hが呼び出されて
pointer allocate(size_type __n, const void* = 0) {
if (__n > this->max_size()) std::__throw_bad_alloc();
return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
}
が走る。つまり、俺の環境だと、std::vector<int> v(100);すると::operator new(std::size_t)が呼び出されて、例外機構を殺して確保も失敗するなら投げられたbad_alloc例外を処理できずにコケる。
これを書き換えてoperator new(__n * sizeof(_Tp), std::nothrow);とするならallocateはメモリを確保できない時にnullptrを返す。すると次に_M_default_initializeが走って、
最終的にplacement newが走って、thisをデレファレンスした瞬間にセグメンテーションフォールトでコケる。

要するに、例外が発生して安全に停止する前提でライブラリが組まれてるから、例外機能をオフにしたら不安定な動作になる。
例外機能をオフにしようが何しようがthrow自体は出来るので、きちんとcatchしましょうって話に落ち着くかと。

295 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 14:09:39.60 ID:oBfAWjKR.net]
>>288
知らなかった・・・



296 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 15:14:11.42 ID:Ycdr5jOx.net]
まあせいぜい「配列への参照」くらいまでだな。

297 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 15:35:32.57 ID:TPiwOAfk.net]
aが配列だったらint*の引数部分に&aの形でもいいのか
なんか気持ち悪いな

298 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 15:59:38.85 ID:5quLb8ti.net]
>>286
回答ありがとうございます。
protectedで継承しているのでstatic_castは無効なのです。
これは移植性ないとみるべきなんでしょうか。
強引にCスタイルキャストでごまかすべきか・・・。Orz

299 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:00:35.47 ID:ucpE/ELv.net]
>>282
細かいことを言うようだけど &a == &a[0] ではないよ。
下の例で、3つのprintf()は同じ値(アドレス)を表示する。
けれども if の部分で有効なのは最初の行だけ。
下の2つのif行の注釈を外すとコンパイルエラーになるはず。
a と &a[0] は等しい。
&a と &a[0] は(値は同じだが)型が違う。型が違うので比較はできない。


#include <cstdio>

int main() {
 int a[] = {1, 2, 3, 4};

 printf("a == %p\n", a);
 printf("&a[0] == %p\n", &a[0]);
 printf("&a == %p\n", &a);

 if (a == &a[0]) printf("Equal\n");
 // if (&a == &a[0]) printf("Equal\n");
 // if (a == &a) printf("Equal\n");

 return 0;
}


>>282 の本題、&a と &a[0] の値が同じになる理由は、
配列の中身がメモリにどう格納されるか、を図で表すと分かりやすいんだが
俺の表現力では無理なんでどなたか頼む。

300 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:01:52.82 ID:7f7wf/mW.net]
>>298
castして欲しくないからprotectedにしてるんじゃないの?

301 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:23:10.99 ID:5quLb8ti.net]
>>300
いやー、ハンドルみたいな使い方を規定していて、
自分は外部関数で値を変更したいんですけど、ユーザーには触ってほしくない。
という、わがままな欲求です。
そのうちUnified Call Syntaxが入ったら、いろいろやろうと思ってるところです。

302 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:25:43.26 ID:MIlHcyxr.net]
>>299
コレ昔VC6でやったら結果が違った
BCC5だとすべて同じ値なのに

303 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:29:56.27 ID:MIlHcyxr.net]
vc6だと&aが結局何処差し示しているかわからんかった

304 名前:299 mailto:sage [2016/02/02(火) 17:53:41.97 ID:ucpE/ELv.net]
>>302
a[] において &a が配列全体のアドレスを表すってのは
ANSI C で統一された挙動だったね。調べ直しちゃったよ。

C++ でも成立するよな。自信が揺らいできた。

305 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 17:55:25.15 ID:C4M/U0aw.net]
VCは規格準拠してないらしいからね
しかたないね



306 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 18:30:04.71 ID:1NZHqYvt.net]
>>282
たまたまお前の処理系がバイト単位でリニアアドレッシングしてるから。
int a[3]; について
 &a[0] は先頭要素のアドレス
 &a は「a[0] a[1] a[2]」という配列全体のアドレス
だから一致する

307 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 18:31:29.65 ID:QW7JMPO0.net]
>>282
https://ideone.com/woT6Lc
&a[0]は要素へのポインタ(一個目の要素へのポインタ)
&aは配列へのポインタ(一個目の配列へのポインタ)だよ

>>231
     :(~):
   :(i:i:i:i:i):
   :(i:i:i:i:i:i:i:):
  :( ゙´ω`゙):   …
  :(:::::::::ソ:::っ:
   :し─J ┃:

308 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 18:35:17.86 ID:KYl+p0oO.net]
一個目の配列って、日本語変

309 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 19:17:24.83 ID:WSo7+ODL.net]
&&&&****aとか&&&&aとかにしても通ってしまう気がした

310 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 20:12:44.79 ID:po3vtalA.net]
arrayと&array[0]が同じなら
なんでsizeof(array)で正しくサイズが出てくるのか分からん

311 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 20:35:13.03 ID:WkrnCzmR.net]
>>310
> arrayと&array[0]が同じなら
ポインタに変換したら一緒になると言うだけ

> なんでsizeof(array)で正しくサイズが出てくるのか分からん
array 自体のサイズをコンパイラは知ってるから

312 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 20:54:40.03 ID:MIlHcyxr.net]
>>309
&と&&は別物だよ
ちなみに&&は定数も代入できる

313 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 20:56:18.82 ID:RveVHAYz.net]
>>312
馬鹿は去れ

314 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:28:49.56 ID:5quLb8ti.net]
array[] -> 配列の型
array[0] ->配列の要素の型

sizeof(array)はdecltype(array)の暗黙に持ってる長さ情報にアクセスしている?
array == &array[0] はアドレス値は同じだが、型自体は違うので持ってる情報は違うもの。前者はT[]。後者は(&T)
暗黙の型変換でぐちゃぐちゃになってるのはお前の頭だ!
であってる?

315 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:29:30.66 ID:5quLb8ti.net]
T&か。



316 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:30:29.16 ID:MIlHcyxr.net]
int &&a = 5 ;

317 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:33:13.54 ID:5quLb8ti.net]
>>316
int&& a=int(5);と等価だっけ?

318 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:34:17.88 ID:MIlHcyxr.net]
T&&a=5 ; が a自体の参照で、
T&&a=n ; でnの参照になったりする。自動で。

319 名前:デフォルトの名無しさん [2016/02/02(火) 21:34:40.95 ID:06fZR6NS.net]
const hoge h;
h.~hoge();
デストラクタはconstついてないのに呼べるのは何故ですか

320 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 21:53:06.16 ID:RveVHAYz.net]
>>302
今確認したが同じアドレスになった
どうしてそう息を吸って吐くように嘘をつくのか

ちなみに&aがどこを指しているかわからないのは
Visual C++ 6.0じゃなくてお前のオツムが原因

321 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 22:09:17.83 ID:MIlHcyxr.net]
>>320
Hotfixいれまくったりすると環境変わるからね
昔のことだからよく覚えてないけど

322 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 22:20:22.89 ID:RveVHAYz.net]
まあこのメッセージを読んでもどこ指してるかわからないようでは致し方ない

int *p = &a;
error C2440: 'initializing' : 'int (*)[4]' から 'int *' に変換することはできません。(新しい動作 ; ヘルプを参照)

323 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 22:51:04.27 ID:MIlHcyxr.net]
>>322
バカでもわかる型の違いですけど
なんでキャストしないのですか?

324 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:11:50.94 ID:x5amnXbs.net]
キャストで逃げようとするほうがバカ
なんで&a[0]にしないのですか?

325 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:20:08.01 ID:RveVHAYz.net]
知っててキャストするなら問題ないだろう
だが>>323の様にどこを指しているかわからないと言ってるのにキャストするのはヤバい
>>318とかはよ病院に行くレベル



326 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:20:42.79 ID:x5amnXbs.net]
(int*)a:7文字 static_castだと当然もっと長くなる
&a[0]:5文字

327 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:27:30.24 ID:MIlHcyxr.net]
何処もヤバくないと思うんだがね
病院逝くのは貴様の方だろ

328 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:31:01.70 ID:7f7wf/mW.net]
&*a:3文字

329 名前:デフォルトの名無しさん mailto:sage [2016/02/02(火) 23:40:56.45 ID:x5amnXbs.net]
&a[0]ならaがstd::vector<int>になっても通用するからそう書けよこのスットコドッコイども

330 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 00:24:20.72 ID:5VKefHqD.net]
c++スレ名物の殴り合いが始まりました!

331 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 07:32:59.13 ID:Gb259GwX.net]
>>329
(int*)aって書ける時点でaは配列かポインタだろ
なんでvectorクラスを仮定してんだよ

332 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 12:46:03.59 ID:6CbCMv4Y.net]
https://ideone.com/wCpVQ1

Javaとは違いC++は基底クラスのインスタンスを派生クラスにダウンキャスト出来てしまうのですが、
これは正しい挙動なのでしょうか。

またオーバーライドした関数が呼べるのは理解できるのですが、
派生クラス独自の関数も呼べてしまうのは腑に落ちません。

333 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 12:54:30.47 ID:AVVts3m8.net]
C++としては正しいが、当然危険なコードなので
もしそうせざるを得ない場合は、設計が間違ってると思うべき

334 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 12:59:18.19 ID:AVVts3m8.net]
正しい挙動の意味にもよるが
どうしても使わざるを得ない場合はdynamic_castを使うべき

335 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 13:02:03.09 ID:EbXG9hpy.net]
>>332
実行時のチェックなしでできてしまうって意味だよね?
プログラマが手動でメモリを割り付けてたりする場合もあるから、下手にチェックされても困るケースがある。
チェックしてほしければvirtual関数持たせた上でdynamic_castしろ。
あと、gが呼べるのは暗黙の引数であるthisに触ってないから、thisがなんであっても問題が表出しないだけ。



336 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 13:59:40.04 ID:XI3wSbIf.net]
>>332
C++言語の仕様上behavior is undefinedなので
どのような結果になっても正しいからな
コンパイラーの出力するコードの都合でたまたまエラー無くspecialが呼び出せてもおかしくはない

337 名前:デフォルトの名無しさん mailto:sage [2016/02/03(水) 19:09:23.55 ID:V5mcV8ll.net]
私はこの分野にあまり詳しくはないのですが、そうなんですか?






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

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

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