探検
0からの、超初心者C++相談室
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2018/11/12(月) 14:55:13.35ID:Tf74ZWQr 何にも知らない0からの出発、超初心者のためのC++相談室
422デフォルトの名無しさん
2022/03/21(月) 11:12:55.05ID:Prmlj1K5 分割コンパイルの仕組みちゃんと理解しないまま雰囲気でヘッダインクルードしてるんですけど
cppファイルに#pragma once書かないのってどうしてですか??
cppファイルに#pragma once書かないのってどうしてですか??
423デフォルトの名無しさん
2022/03/21(月) 11:22:20.21ID:S8aTENmp >>422 書いても意味ないから。
424デフォルトの名無しさん
2022/03/21(月) 11:45:05.99ID:TlR/Mg8q425デフォルトの名無しさん
2022/04/07(木) 19:54:53.05ID:ozPVuLqH cppってインクルード出来たんだ
ヘッダーだけかと思った
ヘッダーだけかと思った
426デフォルトの名無しさん
2022/04/11(月) 15:54:11.00ID:LBY7PFnU 単にコピペしてくるだけだけだからなんでもいいぞ
ルックアップテーブル計算してテキストにダンプし、ソース中に#include "table.txt" で取り込むのを見たことがある
ルックアップテーブル計算してテキストにダンプし、ソース中に#include "table.txt" で取り込むのを見たことがある
427デフォルトの名無しさん
2022/04/11(月) 19:50:08.66ID:uaVZR/I2 IDEだと、プロジェクトに.cppを含めるとコンパイル対象になるので.inlとかにしておくのが無難
428デフォルトの名無しさん
2022/04/30(土) 07:28:15.03ID:2aZ7UOTr 前は中身がcppっぽいのはcppにしてたけど
インクルード前提のファイルはhにするようにした
#define ほにゃらら
#include ファイル名.h
##undef ほにゃらら
インクルードしても単体ソースとしても使えるヤツはcpp
ツールが吐き出したコードやデータでそのままincludeして使えるものは拡張子はそのまま
インクルード前提のファイルはhにするようにした
#define ほにゃらら
#include ファイル名.h
##undef ほにゃらら
インクルードしても単体ソースとしても使えるヤツはcpp
ツールが吐き出したコードやデータでそのままincludeして使えるものは拡張子はそのまま
429デフォルトの名無しさん
2022/06/11(土) 20:56:47.72ID:zBk/MBZO hpp
430デフォルトの名無しさん
2022/06/11(土) 21:01:36.29ID:N4H8T0pQ h と hpp どっちにするかの話じゃなくて
(h or hpp) にするか
(c or cpp) にするか
の話
(h or hpp) にするか
(c or cpp) にするか
の話
431デフォルトの名無しさん
2022/06/11(土) 21:02:37.04ID:N4H8T0pQ 初心者はトリッキーな使い方はしない方が良いから聞かなかった事にして
432デフォルトの名無しさん
2022/06/11(土) 21:20:49.53ID:kM12Kkyp トリッカーズ。
433デフォルトの名無しさん
2022/06/12(日) 10:33:13.76ID:cPTHwR7Q 三角形の秘密はね
434デフォルトの名無しさん
2022/06/12(日) 11:16:51.08ID:v0rlTKHd おなかがすいたら
435デフォルトの名無しさん
2022/06/12(日) 19:40:55.19ID:r44ApDPu ピーナッツ
436デフォルトの名無しさん
2022/06/23(木) 10:13:29.99ID:06mLNX8U なんか、すごい達者さんが並んでますけど、
ここって、
「プログラミング初めたいけど、なんにもわからないので、初めから教えてください。」
というスレです。
ここって、
「プログラミング初めたいけど、なんにもわからないので、初めから教えてください。」
というスレです。
437デフォルトの名無しさん
2022/06/23(木) 10:52:47.91ID:M4XLJX6g 最初からでも0からでも構わんが
自分で努力しないやつはだめ
自分で努力しないやつはだめ
438デフォルトの名無しさん
2022/06/23(木) 11:07:51.97ID:XRNmRbRA 俺は努力しなくてもできちゃうからなあ
439デフォルトの名無しさん
2022/06/23(木) 14:33:26.79ID:06mLNX8U 掛け算の*と、「何ですか?」の*と一緒なんですが、
区別する方法を教えてください。
区別する方法を教えてください。
440デフォルトの名無しさん
2022/06/23(木) 19:37:03.84ID:WbbET00J ポインターの事?
441デフォルトの名無しさん
2022/06/23(木) 19:47:14.20ID:hToQs/iZ は?何ですか?
442デフォルトの名無しさん
2022/06/24(金) 10:44:51.77ID:K2we1Lar オレオレ
443デフォルトの名無しさん
2022/06/24(金) 12:54:50.02ID:fYiV2rYB そうだよオレだよ
444デフォルトの名無しさん
2022/07/16(土) 16:13:36.70ID:2GuJXeRO445デフォルトの名無しさん
2022/07/16(土) 17:44:38.20ID:WOPsEo4E 数字の、xxxと、
数字の、AAAの掛け算は、
xxx*AAAで、いつも迷うんです・・・
数字の、AAAの掛け算は、
xxx*AAAで、いつも迷うんです・・・
446デフォルトの名無しさん
2022/07/16(土) 18:00:17.69ID:QRg/sabr *a+++ ++*b
で迷え
で迷え
447デフォルトの名無しさん
2022/07/16(土) 18:01:53.10ID:QRg/sabr +*a++*++*b
これも
これも
448デフォルトの名無しさん
2022/08/01(月) 07:12:02.16ID:yd/7YIgU map よりも unordered_map の方が高速ですか?
あと追加順が保障されないのが unordered_map ですか?
map は何順ですか?
あと追加順が保障されないのが unordered_map ですか?
map は何順ですか?
449デフォルトの名無しさん
2022/08/01(月) 13:52:12.46ID:jhXgj6wH おまいは何を言っておるのだ?
450はちみつ餃子 ◆8X2XSCHEME
2022/08/01(月) 15:12:11.10ID:YhL9Bhjt >>448
> map よりも unordered_map の方が高速ですか?
操作によるので一概には言えない。
一般的には unordered_map のほうが有利なことが多いとは言えるけれど。
> 追加順が保障されないのが unordered_map ですか?
map でも unordered_map でも追加した順序は保持されない。
C++ に限らず辞書的なデータ構造では格納順序を保持しないのが普通で、
保証があるのは Ruby の Hash くらいだと思う。
Go や Rust だと辿る順序を乱数でかき乱す実装になっているくらいだし。
> map は何順ですか?
キーの順序。
特に指示しなければデフォルトではキーを std::less で比較した順序。
> map よりも unordered_map の方が高速ですか?
操作によるので一概には言えない。
一般的には unordered_map のほうが有利なことが多いとは言えるけれど。
> 追加順が保障されないのが unordered_map ですか?
map でも unordered_map でも追加した順序は保持されない。
C++ に限らず辞書的なデータ構造では格納順序を保持しないのが普通で、
保証があるのは Ruby の Hash くらいだと思う。
Go や Rust だと辿る順序を乱数でかき乱す実装になっているくらいだし。
> map は何順ですか?
キーの順序。
特に指示しなければデフォルトではキーを std::less で比較した順序。
451デフォルトの名無しさん
2022/08/05(金) 04:26:17.70ID:ECXKpFJi そもそもmapの順序ってなんぞや
そりゃ内部表現としての順序(あるいは非順序という名の実装依存の順序)はあるけど
腹ワタ開腹して弄くり回したら、それはもうmapとは呼べねーよ
そりゃ内部表現としての順序(あるいは非順序という名の実装依存の順序)はあるけど
腹ワタ開腹して弄くり回したら、それはもうmapとは呼べねーよ
452デフォルトの名無しさん
2022/08/16(火) 01:02:16.19ID:pMrCsY/x vector<int*> xの特定の要素を削除したい場合
delete x[1];
してから
x.erase(x.begin()+1);
という手順であってますか?
deleteしないとメモリリークしますよね?
delete x[1];
してから
x.erase(x.begin()+1);
という手順であってますか?
deleteしないとメモリリークしますよね?
453はちみつ餃子 ◆8X2XSCHEME
2022/08/16(火) 01:10:03.51ID:+o+ePBjP454デフォルトの名無しさん
2022/08/18(木) 11:36:39.99ID:p/limWqp そもそも移動が大量に発生するのでそんな設計しない
455デフォルトの名無しさん
2022/10/14(金) 01:43:37.78ID:ps9ayw5X bitset<4>("1101")をsigned longに変換したいのですが
簡単な方法は無いでしょうか?
to_ulong()はあるのですが、to_long()が無いっぽいです
簡単な方法は無いでしょうか?
to_ulong()はあるのですが、to_long()が無いっぽいです
456デフォルトの名無しさん
2022/10/14(金) 01:50:46.72ID:cI3rl/qY unsigned longからlongにキャストすればいいだけでは?
457はちみつ餃子 ◆8X2XSCHEME
2022/10/14(金) 02:13:27.03ID:rgl2oNFZ 念のため補足すると、変換後の整数型が符号付きである場合にその型で表現できる範囲をからはずれたときの結果は定義されていない。
しかし bitset<4> を元にするという前提の元では signed long int の範囲からはずれるということはありえない
ので signed long int にキャストするという対処で正しい。
しかし bitset<4> を元にするという前提の元では signed long int の範囲からはずれるということはありえない
ので signed long int にキャストするという対処で正しい。
458デフォルトの名無しさん
2022/10/14(金) 02:13:45.28ID:ps9ayw5X すみません肝心なことを書き忘れていました
2の補数表現された2進数の文字列を
signed longに変換したかったのでした
文字列は諦めて、
-(signed long)bitset<4>(~0b1101+1).to_ulong()
だと一応期待した動作なのですがなんか野暮ったい…
2の補数表現された2進数の文字列を
signed longに変換したかったのでした
文字列は諦めて、
-(signed long)bitset<4>(~0b1101+1).to_ulong()
だと一応期待した動作なのですがなんか野暮ったい…
459デフォルトの名無しさん
2022/10/14(金) 20:52:11.42ID:IQ8pOIWW 4ビットだから符号無しなら0~15だろ
コレを-8~7の符号付きにしたいということか?
コレを-8~7の符号付きにしたいということか?
460デフォルトの名無しさん
2022/10/15(土) 16:23:31.27ID:B8kXjL18 普通に下駄履かせれば(引き算)
461デフォルトの名無しさん
2023/05/24(水) 23:52:31.95ID:lCJuR93r いやー今日はめっちゃ勉強したわ
詳しくなった
詳しくなった
462デフォルトの名無しさん
2023/06/04(日) 09:18:18.28ID:5jvZ+YKl 誘導されて来ますた、
質問なのですがstd::stringに格納された数値文字列を数値にしたい、
しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい、と言う場合どうす
れば良いの?
ダチャい書き方ならできうるけど人類はいつまでstrtod()や&(str[0])……
質問なのですがstd::stringに格納された数値文字列を数値にしたい、
しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい、と言う場合どうす
れば良いの?
ダチャい書き方ならできうるけど人類はいつまでstrtod()や&(str[0])……
463はちみつ餃子 ◆8X2XSCHEME
2023/06/04(日) 09:22:50.76ID:MHoxWKtY464デフォルトの名無しさん
2023/06/04(日) 09:28:48.33ID:5jvZ+YKl >>463
だって&(str[0])とかナマポやし……
文字列型がchar以外になったら(std::basic_string<TCHAR>とか)になることも見越したら
手でテンプレート書かないといけないから牛刀感があるし、
文字列が厳格に数値文字列なのか検査するとかアプリのコードであるあるなので
アプリレベル(高級アセンブラ的でない書き方)の手段が用意されていて然るべきな気がして仕方が無いし、
だって&(str[0])とかナマポやし……
文字列型がchar以外になったら(std::basic_string<TCHAR>とか)になることも見越したら
手でテンプレート書かないといけないから牛刀感があるし、
文字列が厳格に数値文字列なのか検査するとかアプリのコードであるあるなので
アプリレベル(高級アセンブラ的でない書き方)の手段が用意されていて然るべきな気がして仕方が無いし、
465デフォルトの名無しさん
2023/06/04(日) 09:30:18.23ID:5jvZ+YKl 無いというなら仕方が無いが、漏れはちょう初心者ですら……
466はちみつ餃子 ◆8X2XSCHEME
2023/06/04(日) 09:37:21.42ID:MHoxWKtY >>464
std::stod は std::string と std::wstring に対応してるよ。
std::stod は std::string と std::wstring に対応してるよ。
467デフォルトの名無しさん
2023/06/04(日) 09:39:47.38ID:5jvZ+YKl468はちみつ餃子 ◆8X2XSCHEME
2023/06/04(日) 09:52:59.20ID:MHoxWKtY469デフォルトの名無しさん
2023/06/04(日) 09:55:13.77ID:5jvZ+YKl 実は正規表現でも使えば何とかなる……
のか……
std::regex re("^\s*([\d.]+)\s*$");
std::smatch m;
if (std::regex_match(str, m, re)) {
return m[1].str().strtod();
} else {
エラー
}
のか……
std::regex re("^\s*([\d.]+)\s*$");
std::smatch m;
if (std::regex_match(str, m, re)) {
return m[1].str().strtod();
} else {
エラー
}
470デフォルトの名無しさん
2023/06/04(日) 09:56:15.54ID:5jvZ+YKl471はちみつ餃子 ◆8X2XSCHEME
2023/06/04(日) 10:00:50.19ID:MHoxWKtY >>470
続くものが何であるかは自分で確認してエラーにするという話をしてると思ったんやが。
続くものが何であるかは自分で確認してエラーにするという話をしてると思ったんやが。
472デフォルトの名無しさん
2023/06/04(日) 10:05:01.33ID:5jvZ+YKl473はちみつ餃子 ◆8X2XSCHEME
2023/06/04(日) 10:13:13.65ID:MHoxWKtY474デフォルトの名無しさん
2023/06/04(日) 11:40:09.61ID:bxWaSYac 単位でも確認したいの?
だったらstd::ends_withとかstd::rfindとstd::substrで数字の後ろ切り出すとかでチェックしてからstd::stodでよくね
チェックは自分の要件だから自分で書け標準ライブラリはお前のお母さんではない
だったらstd::ends_withとかstd::rfindとstd::substrで数字の後ろ切り出すとかでチェックしてからstd::stodでよくね
チェックは自分の要件だから自分で書け標準ライブラリはお前のお母さんではない
475デフォルトの名無しさん
2023/06/04(日) 11:51:26.73ID:xmEQJDCs 正規表現でチェックするのが1番自然な気がする
476デフォルトの名無しさん
2023/06/04(日) 22:03:06.86ID:5jvZ+YKl >>474
> 単位でも確認したいの?
> だったらstd::ends_withとかstd::rfindとstd::substrで数字の後ろ切り出すとかでチェックしてからstd::stodでよくね
std::stringに格納された数値文字列を数値にしたい、
しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい(>>462
> チェックは自分の要件だから自分で書け標準ライブラリはお前のお母さんではない
チェックのためには(例えばstd::stodが)どこまで読んだのかの情報が要る
std::stodの裏側では文字列を数値解釈する枯れたコードが動いているわけで、
そいつにどこまで読んだのか、ただ1個の整数データを聞けさえすれば良い。
これはそれほど無茶な話ではないはずで実際strtod()ではできるから
どっちかというtライブラリにちょっち不備があるのでは案件であってお母さん案件ではない。
> 単位でも確認したいの?
> だったらstd::ends_withとかstd::rfindとstd::substrで数字の後ろ切り出すとかでチェックしてからstd::stodでよくね
std::stringに格納された数値文字列を数値にしたい、
しかし数値以外の文字(ただし空白文字は認める)が後ろにくっついていたらエラーにしたい(>>462
> チェックは自分の要件だから自分で書け標準ライブラリはお前のお母さんではない
チェックのためには(例えばstd::stodが)どこまで読んだのかの情報が要る
std::stodの裏側では文字列を数値解釈する枯れたコードが動いているわけで、
そいつにどこまで読んだのか、ただ1個の整数データを聞けさえすれば良い。
これはそれほど無茶な話ではないはずで実際strtod()ではできるから
どっちかというtライブラリにちょっち不備があるのでは案件であってお母さん案件ではない。
477デフォルトの名無しさん
2023/06/04(日) 22:20:35.13ID:5jvZ+YKl >>475
上に書いた通り(例えば)std::stodがどこまで読んだのかだけイブラリが返してくれさえしたら解決するのじゃ
正規表現は意味的には合目的的な手段やが、普通の正規表現エンジンの実装なら正規表現オブジェクトを作った際に
FSMを(表形式か何かで)生成する処理が中で動くので、そんなに軽い処理ではないからやっぱ牛刀感みある…
いったん作ったらマッチングは表駆動でやれるので速いことが気体できるのではないか、という香具師が居るかもしれないが、
実はstd::stod()に最大限仕事させたい(正規表現の側で数値文字列の書式についてわざわざ指定したっくない
場合は>>496の正規表現は正しくは "^\\s*(.*?)\s*$"にせねばならないからマッチング時にバックトラックが発生して遅い可能性がある
これもちょっちイヤソな理由
繰り返しになるが(例えば)std::stodがどこまで読んだのかだけイブラリが返してくれさえしたらこんな考慮は不要で完全に円満に解決するのじゃ……
上に書いた通り(例えば)std::stodがどこまで読んだのかだけイブラリが返してくれさえしたら解決するのじゃ
正規表現は意味的には合目的的な手段やが、普通の正規表現エンジンの実装なら正規表現オブジェクトを作った際に
FSMを(表形式か何かで)生成する処理が中で動くので、そんなに軽い処理ではないからやっぱ牛刀感みある…
いったん作ったらマッチングは表駆動でやれるので速いことが気体できるのではないか、という香具師が居るかもしれないが、
実はstd::stod()に最大限仕事させたい(正規表現の側で数値文字列の書式についてわざわざ指定したっくない
場合は>>496の正規表現は正しくは "^\\s*(.*?)\s*$"にせねばならないからマッチング時にバックトラックが発生して遅い可能性がある
これもちょっちイヤソな理由
繰り返しになるが(例えば)std::stodがどこまで読んだのかだけイブラリが返してくれさえしたらこんな考慮は不要で完全に円満に解決するのじゃ……
478デフォルトの名無しさん
2023/06/04(日) 22:30:29.50ID:bxWaSYac479デフォルトの名無しさん
2023/06/05(月) 00:32:44.63ID:8dockxGx 便乗質問していいですか
某所で似たような問題があったのだけど、付加条件として、数値がINT_MAXを超える場合は
INT_MAX、INT_MINを下回る場合はINT_MINを返す、がありました
stodを使う場合(stoll等でもいいですが)、これってどうやって処理すればいいですかね
某所で似たような問題があったのだけど、付加条件として、数値がINT_MAXを超える場合は
INT_MAX、INT_MINを下回る場合はINT_MINを返す、がありました
stodを使う場合(stoll等でもいいですが)、これってどうやって処理すればいいですかね
480デフォルトの名無しさん
2023/06/05(月) 00:38:04.95ID:8dockxGx 念の為「数値が」というのは元の文字列での、です。たとえば "1000000000000"みたいな
可能性としてはLONG_LONG_MAXを超えている場合もありますね
可能性としてはLONG_LONG_MAXを超えている場合もありますね
481デフォルトの名無しさん
2023/06/05(月) 00:46:19.80ID:oX+QCkCh stoi系は範囲越えたらstd::out_of_rangeを投げるはずだが
482デフォルトの名無しさん
2023/06/05(月) 01:19:48.15ID:8dockxGx _MAXで超えたか_MINで超えたかってわかりますかね
483デフォルトの名無しさん
2023/06/05(月) 01:31:31.21ID:oX+QCkCh 先頭文字が'-'かどうか見れば?
484デフォルトの名無しさん
2023/06/05(月) 01:54:42.53ID:yTJt/rkc >>478
どういうこっちゃkwsk、
どういうこっちゃkwsk、
485デフォルトの名無しさん
2023/06/05(月) 02:04:38.53ID:LZnxgWkc >>484
https://ja.cppreference.com/w/cpp/string/basic_string/stof
> pos がヌルポインタでなければ、ポインタ ptr (変換関数の内部的な変数) が str.c_str() 内の最初の変換されなかった文字のアドレスを受け取り、その文字のインデックスが計算されて *pos に格納されます。 これは変換によって処理された文字数になります。
> 引数
> str - 変換する文字列
> pos - 処理された文字数を格納する整数のアドレス
https://ja.cppreference.com/w/cpp/string/basic_string/stof
> pos がヌルポインタでなければ、ポインタ ptr (変換関数の内部的な変数) が str.c_str() 内の最初の変換されなかった文字のアドレスを受け取り、その文字のインデックスが計算されて *pos に格納されます。 これは変換によって処理された文字数になります。
> 引数
> str - 変換する文字列
> pos - 処理された文字数を格納する整数のアドレス
486デフォルトの名無しさん
2023/06/05(月) 02:37:23.50ID:yTJt/rkc >>485
㌧クスわかりたorz
㌧クスわかりたorz
487デフォルトの名無しさん
2023/06/05(月) 06:49:34.05ID:8dockxGx >>483
そうですね、でも文字列の先頭とは限らないですよね。やはりこの場合はある程度は
自力で文字列をパースする必要がある感じですかね
ちなみに数字以外が含まれるときの挙動は "hoge 123"みたいに数字より前に非数字
がくるのは駄目だけど逆に"123 hoge"みたいのはおkなんですね
そうですね、でも文字列の先頭とは限らないですよね。やはりこの場合はある程度は
自力で文字列をパースする必要がある感じですかね
ちなみに数字以外が含まれるときの挙動は "hoge 123"みたいに数字より前に非数字
がくるのは駄目だけど逆に"123 hoge"みたいのはおkなんですね
488デフォルトの名無しさん
2023/06/20(火) 19:02:06.99ID:mbwsU8Mq 話題がないから質問してみる
struct Summer {};
Summer summer;
Summer *const summerConstPtr{};
const_cast<Summer*>(summerConstPtr) = &summer; // だめ
const_cast<Summer*&>(summerConstPtr) = &summer; // いける
質問1) 最後のいけるやつのconst_cast<Summer*&>の「&」はどういう意味なんでしょう? 参照のことかいな?
質問2) なんでconst_cast<Summer*>ではだめなのかな?
struct Summer {};
Summer summer;
Summer *const summerConstPtr{};
const_cast<Summer*>(summerConstPtr) = &summer; // だめ
const_cast<Summer*&>(summerConstPtr) = &summer; // いける
質問1) 最後のいけるやつのconst_cast<Summer*&>の「&」はどういう意味なんでしょう? 参照のことかいな?
質問2) なんでconst_cast<Summer*>ではだめなのかな?
489デフォルトの名無しさん
2023/06/20(火) 19:05:08.72ID:mbwsU8Mq なんか変換されたw
∑merでなくて&summerです
∑merでなくて&summerです
490はちみつ餃子 ◆8X2XSCHEME
2023/06/20(火) 20:45:04.07ID:IIzrqfbq >>488
参照が絡むとややこしくて単純に説明できないんだけど
代入演算子の左側は変更可能な lvalue (modifiable lvalue) であることということになっていて
そのキャストだと prvalue になってしまうから代入できないという結果になる。
たとえば
int x = 1;
x = 2;
は有りだけど
1 = 2;
は駄目なのはわかるでしょ。
この代入のときの x はそこに入っている 1 という値に意味はなくて場所に意味がある。
値として取り出されてしまうと代入できないんだ。
参照が絡むとややこしくて単純に説明できないんだけど
代入演算子の左側は変更可能な lvalue (modifiable lvalue) であることということになっていて
そのキャストだと prvalue になってしまうから代入できないという結果になる。
たとえば
int x = 1;
x = 2;
は有りだけど
1 = 2;
は駄目なのはわかるでしょ。
この代入のときの x はそこに入っている 1 という値に意味はなくて場所に意味がある。
値として取り出されてしまうと代入できないんだ。
491はちみつ餃子 ◆8X2XSCHEME
2023/06/20(火) 20:54:10.99ID:IIzrqfbq どういうときにどういう値カテゴリに属すことになるのか正確なところはここ見て。
https://timsong-cpp.github.io/cppwp/n3337/basic.lval
C++03 時代は lvalue と rvalue だけの単純な (と言ってもそれなりに複雑だが……) 世界だったんだけど
右辺値参照の概念を整理するため (?) かだいぶんごちゃついてる。
https://timsong-cpp.github.io/cppwp/n3337/basic.lval
C++03 時代は lvalue と rvalue だけの単純な (と言ってもそれなりに複雑だが……) 世界だったんだけど
右辺値参照の概念を整理するため (?) かだいぶんごちゃついてる。
492デフォルトの名無しさん
2023/06/20(火) 23:48:13.65ID:mbwsU8Mq >>490
返答ありがとう。
なぜconst_cast<Summer*>(summerConstPtr)が左辺としていけないのかがわかりませぬ。
summerConstPtrはconst_cast<Summer*>によって「Summer *const」から「const」が外れて「Summer*」となって
Summer *summerPtr;
summerPtr = &summer;
とするときの左辺summerPtrと同じようになったわけではないのでしょうか?
どうもこの左辺summerPtrと同じようにするためには、const_cast<Summer*&>としなければならないようだが、この「&」にはどんな意味ががが??
返答ありがとう。
なぜconst_cast<Summer*>(summerConstPtr)が左辺としていけないのかがわかりませぬ。
summerConstPtrはconst_cast<Summer*>によって「Summer *const」から「const」が外れて「Summer*」となって
Summer *summerPtr;
summerPtr = &summer;
とするときの左辺summerPtrと同じようになったわけではないのでしょうか?
どうもこの左辺summerPtrと同じようにするためには、const_cast<Summer*&>としなければならないようだが、この「&」にはどんな意味ががが??
493はちみつ餃子 ◆8X2XSCHEME
2023/06/21(水) 00:33:00.36ID:3HBFHOpK >>492
型とは別に (型と無関係ではないが) 文脈にカテゴリが存在するというのが肝心な部分。
どれがどのカテゴリに属すのかはダラダラとした箇条書きで書いてあって単純な原則では示せない。
(結果的には辻褄の合うようになってるけど……。)
& は参照を表す記号という解釈は正しい。
参照は lvalue なのでキャストの結果も lvalue ってだけ。
型とは別に (型と無関係ではないが) 文脈にカテゴリが存在するというのが肝心な部分。
どれがどのカテゴリに属すのかはダラダラとした箇条書きで書いてあって単純な原則では示せない。
(結果的には辻褄の合うようになってるけど……。)
& は参照を表す記号という解釈は正しい。
参照は lvalue なのでキャストの結果も lvalue ってだけ。
494デフォルトの名無しさん
2023/06/21(水) 01:03:31.08ID:tILY3YM/495デフォルトの名無しさん
2023/06/21(水) 11:05:32.10ID:cZp0PZIW >>493,494
「&」はやはり参照でしたか。
左辺の規則と右辺の規則があり、キャストしたポインターでは左辺の規則に従ってなくて、キャストした参照なら左辺の規則に従っていると、そうなっていると覚えるほかないのでありますな。
ありがとう。
「&」はやはり参照でしたか。
左辺の規則と右辺の規則があり、キャストしたポインターでは左辺の規則に従ってなくて、キャストした参照なら左辺の規則に従っていると、そうなっていると覚えるほかないのでありますな。
ありがとう。
496デフォルトの名無しさん
2023/06/29(木) 00:53:29.69ID:l197jz/x なんで可変長配列の名前がvectorなの?
497はちみつ餃子 ◆8X2XSCHEME
2023/06/29(木) 08:14:12.68ID:l+ZsGqGg 伝統。
498デフォルトの名無しさん
2023/06/29(木) 13:14:41.30ID:DfwcYShQ https://www.google.co.jp/search?q=%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB+%E6%84%8F%E5%91%B3
向きを持つ量をベクトルという
向きを持つためには複数の量が必要(単一の量はスカラーという)
それを抽象化して、要素を一列に並べたものをベクトルという
向きを持つ量をベクトルという
向きを持つためには複数の量が必要(単一の量はスカラーという)
それを抽象化して、要素を一列に並べたものをベクトルという
499デフォルトの名無しさん
2023/07/04(火) 17:43:58.34ID:Ld2RSFGK c++に限定される疑問ではないかも知れませんが標準出力がどうやってコンソールに出力しているか?というところで躓いてます
gnuのlibcを見てもわからず、アセンブラを見て0x80というシステムコールをしているところまで辿り着いたけど無学なので理解できずにいます
OSが用意している機能を実行しているという認識であってますか?
gnuのlibcを見てもわからず、アセンブラを見て0x80というシステムコールをしているところまで辿り着いたけど無学なので理解できずにいます
OSが用意している機能を実行しているという認識であってますか?
500はちみつ餃子 ◆8X2XSCHEME
2023/07/04(火) 17:52:47.39ID:wwaI/oJF >>499
そうだよ。
現代の OS は権限の管理がしっかりしてて、アプリケーションは
プロセスの外のリソース (メモリやデバイス) を直接には使えない。
OS に要求して適当なところに橋渡ししてもらう構造。
そうだよ。
現代の OS は権限の管理がしっかりしてて、アプリケーションは
プロセスの外のリソース (メモリやデバイス) を直接には使えない。
OS に要求して適当なところに橋渡ししてもらう構造。
501デフォルトの名無しさん
2023/07/04(火) 18:05:29.71ID:Ld2RSFGK >>500
どうやって実行中のコンソールに出力しているのだろうという素朴な疑問だったのですが、この先はOS仕事という事なんですね
自分で見ろって言われるかもしれませんが、OSの処理の実装を見るのは難易度高いですか?
HelloWorldからどちらに進もうか迷ってます
どうやって実行中のコンソールに出力しているのだろうという素朴な疑問だったのですが、この先はOS仕事という事なんですね
自分で見ろって言われるかもしれませんが、OSの処理の実装を見るのは難易度高いですか?
HelloWorldからどちらに進もうか迷ってます
502デフォルトの名無しさん
2023/07/04(火) 19:16:32.21ID:Ld2RSFGK 同様のテーマのITmediaの記事を見つけたので腰を据えて取り組んでみようと思います
回答いただきありがとうございましたお騒がせしました
回答いただきありがとうございましたお騒がせしました
503はちみつ餃子 ◆8X2XSCHEME
2023/07/05(水) 00:40:03.93ID:h//lr2GB >>501
標準出力の実態はパイプ。
パイプの接続先がターミナルのプロセスが繋がってるだけでカーネルはそれほど大したことはやってない。
と言えれば簡単なんだけど端末制御まわりは歴史的事情でよくわからんことになってるので
ソースコードだけから読み取ろうとするのはしんどいと思う。
標準出力の実態はパイプ。
パイプの接続先がターミナルのプロセスが繋がってるだけでカーネルはそれほど大したことはやってない。
と言えれば簡単なんだけど端末制御まわりは歴史的事情でよくわからんことになってるので
ソースコードだけから読み取ろうとするのはしんどいと思う。
504デフォルトの名無しさん
2023/07/13(木) 01:46:39.34ID:a7xsv8mg shared_ptrの解放時にweak_ptrを登録していたSTLコンテナから登録抹消したいけど、
shared_ptrのデリータでshared_ptr自身は扱えないっぽい。
出来ないということは、何か他にいい方法があるか、根本的に何か考え方間違ってる?
shared_ptrのデリータでshared_ptr自身は扱えないっぽい。
出来ないということは、何か他にいい方法があるか、根本的に何か考え方間違ってる?
505はちみつ餃子 ◆8X2XSCHEME
2023/07/13(木) 18:07:22.25ID:46c6OBqO >>504
設計意図次第だけど
コンテナにはオブジェクト本体をいれて shared_ptr は
コンテナ内の要素を指すイテレータを指す
という構造はどうだろう。
#include <iostream>
#include <memory>
#include <set>
int main(void) {
std::set<int> container;
auto [iter, result] = container.emplace(42);
{
// コンテナ内の要素を指す shared_ptr をいくつも作る
auto x = std::shared_ptr<decltype(iter)>(new decltype(container)::iterator(iter), [&container](decltype(container)::iterator* p) { container.erase(*p); delete p;});
auto y = x;
auto z = x;
// コンテナの中には要素が入ってる
for (auto& x : container) std::cout << x << " ";
std::cout << std::endl;
// shared_ptr はここで消滅
}
// デリータが消したのでもう残ってない
for (auto& x : container) std::cout << x << std::endl;
}
設計意図次第だけど
コンテナにはオブジェクト本体をいれて shared_ptr は
コンテナ内の要素を指すイテレータを指す
という構造はどうだろう。
#include <iostream>
#include <memory>
#include <set>
int main(void) {
std::set<int> container;
auto [iter, result] = container.emplace(42);
{
// コンテナ内の要素を指す shared_ptr をいくつも作る
auto x = std::shared_ptr<decltype(iter)>(new decltype(container)::iterator(iter), [&container](decltype(container)::iterator* p) { container.erase(*p); delete p;});
auto y = x;
auto z = x;
// コンテナの中には要素が入ってる
for (auto& x : container) std::cout << x << " ";
std::cout << std::endl;
// shared_ptr はここで消滅
}
// デリータが消したのでもう残ってない
for (auto& x : container) std::cout << x << std::endl;
}
506デフォルトの名無しさん
2023/07/13(木) 21:30:08.90ID:BEK5Ztwm >>505 ありがとうございます。実体とイテレータ、参考になります。
おかげで解放時何とかshared_ptrで引数を渡そうとしてましたが、諦めて実体でもいいんではと思い始めました。
回答を見るまでは、shared_ptr<shared_ptr<X>>なら解放時にshared_ptr<X>取れるじゃん、
修正とか色々めんどくさいけど、とかアホなこと考えてました。
処理の概略はshared_ptr側で値管理、コンテナ側は登録されたweak_ptrの値と別の値が合致したら処理、
shared_ptr側解放時コンテナ側から登録抹消(抹消関数の引数にshared_ptr:これがNG)というものです。
おかげで解放時何とかshared_ptrで引数を渡そうとしてましたが、諦めて実体でもいいんではと思い始めました。
回答を見るまでは、shared_ptr<shared_ptr<X>>なら解放時にshared_ptr<X>取れるじゃん、
修正とか色々めんどくさいけど、とかアホなこと考えてました。
処理の概略はshared_ptr側で値管理、コンテナ側は登録されたweak_ptrの値と別の値が合致したら処理、
shared_ptr側解放時コンテナ側から登録抹消(抹消関数の引数にshared_ptr:これがNG)というものです。
507デフォルトの名無しさん
2023/07/16(日) 13:37:45.84ID:aonKa36p 設計意図次第
508504
2023/07/16(日) 21:29:25.31ID:AcIm+utR 何でかshared_ptrって派生出来ないと思い込んでたけど出来た。
shared_ptrで出来ない理由は分からんが、他に変な問題が無ければほぼ当初の想定通り。
ありがとうありがとう。
template<class T>
struct X : public std::shared_ptr<T> {
X(T* t) : std::shared_ptr<T>(t){}
~X(){/*X自体の登録抹消*/}
};
shared_ptrで出来ない理由は分からんが、他に変な問題が無ければほぼ当初の想定通り。
ありがとうありがとう。
template<class T>
struct X : public std::shared_ptr<T> {
X(T* t) : std::shared_ptr<T>(t){}
~X(){/*X自体の登録抹消*/}
};
509蟻人間 ◆T6xkBnTXz7B0
2023/07/16(日) 22:10:43.92ID:/+p/BpGt クラス内部で
using std::shared_ptr<T>;
を付けるとコンストラクタの実装が完璧になるよ。
using std::shared_ptr<T>;
を付けるとコンストラクタの実装が完璧になるよ。
510蟻人間 ◆T6xkBnTXz7B0
2023/07/16(日) 22:12:03.59ID:/+p/BpGt511504
2023/07/16(日) 22:37:21.87ID:AcIm+utR >>510 基底クラス(shared_ptr)のコンストラクタを派生側に引っ張って来る便利な奴ですね(覚えきれてない)。
ありがとうございます。自前実装不要なのは助かります。
ありがとうございます。自前実装不要なのは助かります。
512はちみつ餃子 ◆8X2XSCHEME
2023/07/17(月) 00:18:57.61ID:YifLUjyU513504
2023/07/17(月) 01:33:58.67ID:9b8iHtwy >>512 …あー。それは意図通りではないですね。実際の解放はデストラクタで
use_count()==1であることを確認する必要があるのかな。ありがとうございます。
use_count()==1であることを確認する必要があるのかな。ありがとうございます。
514はちみつ餃子 ◆8X2XSCHEME
2023/07/18(火) 09:19:59.88ID://OyAtPF パブリック継承した型では基底への型変換を禁じることができない。
つまり
X<int> foo = new int(1);
std::shared_ptr<int> bar = foo;
みたいなことが出来てしまう。
間違った使い方を想定するとキリがないから
なんでもかんでもガチガチに型を設計する必要はないんだけど、
この場合はどこかでミスりそうと思うので
私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
つまり
X<int> foo = new int(1);
std::shared_ptr<int> bar = foo;
みたいなことが出来てしまう。
間違った使い方を想定するとキリがないから
なんでもかんでもガチガチに型を設計する必要はないんだけど、
この場合はどこかでミスりそうと思うので
私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
515504
2023/07/19(水) 03:16:45.39ID:0uGQJSD8 >>514
御忠告ありがとうございます。
高々shared_ptr自身を解放するだけと思っていたんですが、色々難しいですね。
> パブリック継承した型では基底への型変換を禁じることができない。
そんな問題があるとは。
派生クラスのキャスト演算子は引っかからず、基底クラスの
コピーコンストラクタをいじらないと禁止出来ないっぽかった。
protected継承にしてみたら代入は出来なかった。うーん、他に問題が無ければこれですかね。
> 間違った使い方を想定するとキリがないから
> なんでもかんでもガチガチに型を設計する必要はないんだけど、
> この場合はどこかでミスりそうと思うので
> 私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
候補はprotected継承(暫定)、shared_ptr相当自作、或いは他の未知なる何か。
しかし一番素直で的確に機能を実現可能と思っているのがshared_ptrの拡張なので、
別の形で実現する方法はどうも迂遠過ぎて自分には思いつかないです。
# shared_ptr側がデータ実体と登録したコンテナの情報を持ち、コンテナ側はweak_ptrで参照
なので流石に自作は無し、とりあえず他に致命的な問題が無ければprotected継承で実装して、
他により良い方法を思いついたらそっちに乗り換えることにします。
御忠告ありがとうございます。
高々shared_ptr自身を解放するだけと思っていたんですが、色々難しいですね。
> パブリック継承した型では基底への型変換を禁じることができない。
そんな問題があるとは。
派生クラスのキャスト演算子は引っかからず、基底クラスの
コピーコンストラクタをいじらないと禁止出来ないっぽかった。
protected継承にしてみたら代入は出来なかった。うーん、他に問題が無ければこれですかね。
> 間違った使い方を想定するとキリがないから
> なんでもかんでもガチガチに型を設計する必要はないんだけど、
> この場合はどこかでミスりそうと思うので
> 私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
候補はprotected継承(暫定)、shared_ptr相当自作、或いは他の未知なる何か。
しかし一番素直で的確に機能を実現可能と思っているのがshared_ptrの拡張なので、
別の形で実現する方法はどうも迂遠過ぎて自分には思いつかないです。
# shared_ptr側がデータ実体と登録したコンテナの情報を持ち、コンテナ側はweak_ptrで参照
なので流石に自作は無し、とりあえず他に致命的な問題が無ければprotected継承で実装して、
他により良い方法を思いついたらそっちに乗り換えることにします。
516504
2023/07/19(水) 18:45:15.41ID:4lyHW67x そういえばweak_ptr試してない…?と思って試したら当然の如く代入できなかったので、
public継承でほったらかします。
public継承でほったらかします。
517デフォルトの名無しさん
2023/07/20(木) 15:28:07.42ID:6BSTmMYa templateの世界へようこそ
518はちみつ餃子 ◆8X2XSCHEME
2023/07/21(金) 13:23:19.14ID:NiBubQrd std::unique_ptr なら型引数でもデリータを与えることが出来て、
型引数が異なれば異なる型ということになる。
#include <memory>
template<class T> struct custom_delete : public default_delete<T> {};
int main(void) {
std::unique_ptr<int, custom_delete<int>> foo{new int(42)};
// ↓ 別の型なので移動できない。 エラーになる。
std::unique_ptr<int> bar = std::move(foo);
}
ところが std::shared_ptr では型引数でデリータをカスタマイズすることが出来ない。
解体は動的な型に従うという保証をしているので。
#include <memory>
struct foo {};
struct bar : public foo {};
int main(void) {
// 解体のときに foo ではなく bar の
// デストラクタが呼ばれることが保証される
std::shared_ptr<foo> x{new bar};
}
std::shared_ptr は動的な情報 (実行時の情報) を元に挙動が決まるというのが
設計理念なので削除方法をカスタマイズしたいならコンストラクタにデリータを渡す
というのが最も自然な形と言える。
std::shared_ptr を継承する形でカスタマイズしようとするのは
してもそれ自体は仕様に反しないけれど不自然だなぁとは思う。 (個人の感想です。)
型引数が異なれば異なる型ということになる。
#include <memory>
template<class T> struct custom_delete : public default_delete<T> {};
int main(void) {
std::unique_ptr<int, custom_delete<int>> foo{new int(42)};
// ↓ 別の型なので移動できない。 エラーになる。
std::unique_ptr<int> bar = std::move(foo);
}
ところが std::shared_ptr では型引数でデリータをカスタマイズすることが出来ない。
解体は動的な型に従うという保証をしているので。
#include <memory>
struct foo {};
struct bar : public foo {};
int main(void) {
// 解体のときに foo ではなく bar の
// デストラクタが呼ばれることが保証される
std::shared_ptr<foo> x{new bar};
}
std::shared_ptr は動的な情報 (実行時の情報) を元に挙動が決まるというのが
設計理念なので削除方法をカスタマイズしたいならコンストラクタにデリータを渡す
というのが最も自然な形と言える。
std::shared_ptr を継承する形でカスタマイズしようとするのは
してもそれ自体は仕様に反しないけれど不自然だなぁとは思う。 (個人の感想です。)
519504
2023/07/21(金) 20:08:15.21ID:jaEOXewl 一応発端の動かなかったコードを短くしたのでおいときます。
0.動機:shared_ptr<int>のdeleterでvector<weak_ptr>を削除したい
1.deleter内だとxは有効でuse_count 0だったけど、vectorのweak_ptrは無効だったのでvectorから削除できない。
2.shared_ptr<int>のデリータはint*に対するもので、shared_ptr<int>へのポインタはshared_ptr<int>の
デストラクタじゃないと処理できないけど、既製品だから外からいじられない。
3.んじゃ、手っ取り早くshared_ptr継承してデストラクタを使えるようにすれば?
というのが趣旨でした。
#include<vector>
#include<memory>
int main(){
std::vector<std::weak_ptr<int>> v;
std::shared_ptr<int> x(new int(3), [&x, &v](int* i){
for(int j = 0; j < v.size(); j++){
std::shared_ptr<int> t = v[j].lock();
if(t && t == x){v.erase(v.begin() + j); break;}
}
delete i;
});
v.push_back(x);
}
0.動機:shared_ptr<int>のdeleterでvector<weak_ptr>を削除したい
1.deleter内だとxは有効でuse_count 0だったけど、vectorのweak_ptrは無効だったのでvectorから削除できない。
2.shared_ptr<int>のデリータはint*に対するもので、shared_ptr<int>へのポインタはshared_ptr<int>の
デストラクタじゃないと処理できないけど、既製品だから外からいじられない。
3.んじゃ、手っ取り早くshared_ptr継承してデストラクタを使えるようにすれば?
というのが趣旨でした。
#include<vector>
#include<memory>
int main(){
std::vector<std::weak_ptr<int>> v;
std::shared_ptr<int> x(new int(3), [&x, &v](int* i){
for(int j = 0; j < v.size(); j++){
std::shared_ptr<int> t = v[j].lock();
if(t && t == x){v.erase(v.begin() + j); break;}
}
delete i;
});
v.push_back(x);
}
520デフォルトの名無しさん
2023/07/25(火) 09:24:45.92ID:k8WJtY+U >shared_ptr<int>へのポインタはshared_ptr<int>のデストラクタじゃないと処理できない
これが無理っしょ
これが無理っしょ
521デフォルトの名無しさん
2023/07/28(金) 10:56:39.59ID:Zgvcm9f5 なんで出来ると思ったの
522デフォルトの名無しさん
2023/07/29(土) 20:15:59.76ID:ETnyq2kJ shared_ptrのデリータで他所様のオブジェクトもついでに解体したろっていう発想そのものが危険な香りしかしなくてゾワゾワする
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国の局長は「両手をポケット」で対峙 宣伝戦で国民に示す ★3 [蚤の市★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★4 [ぐれ★]
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 【カブス】今永昇太 1年約34億円で残留へ QO受諾 米メディア報じる [鉄チーズ烏★]
- 【大分】佐賀関で大規模火災、170棟以上が延焼中 70代男性1人と連絡取れず [ぐれ★]
- 「COP30」開催地を軽蔑? ドイツ首相発言に批判 [蚤の市★]
- 【悲報】高市有事で日本に同調する国、1つも現れないwwwwwwwwwwwwwww [603416639]
- 【雑談】暇人集会所part19
- 自閉症が「んなっしょい」と連呼するお🏡
- 【悲報】女の子、整形で片目失明...高市助けて... [856698234]
- アンケート調査で「高市発言は問題なし」 93.5%wwwwwwwwwwwwwwwwwwwwwwwww [279254606]
- 高市「次回選挙争点は台湾有事よ!!」自民立憲公明維新国民「やめろーー!!」これが現実になりそうな件 [469534301]
