C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part145
http://mevius.5ch.net/test/read.cgi/tech/1568362404/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
探検
C++相談室 part146
レス数が900を超えています。1000を超えると表示できなくなるよ。
2019/11/07(木) 11:35:36.76ID:4wggfTwe
849デフォルトの名無しさん
2019/12/13(金) 22:27:26.74ID:0IHjBlJG 実行結果。
Start
6
0
Finish
最後の定義が有効になってるように見える。
Start
6
0
Finish
最後の定義が有効になってるように見える。
850デフォルトの名無しさん
2019/12/13(金) 22:28:16.14ID:0IHjBlJG Wandbox
C++
gcc HEAD 10.0.0 2019
C++
gcc HEAD 10.0.0 2019
851デフォルトの名無しさん
2019/12/13(金) 22:54:36.18ID:T1rtAOWF ありがとうございます、その結果を見るとgccがおかしいぽいですね・・・
宣言時に初期化は必須と考えて書いていこうと思います、ありがとうございました
宣言時に初期化は必須と考えて書いていこうと思います、ありがとうございました
852デフォルトの名無しさん
2019/12/13(金) 22:57:06.09ID:0IHjBlJG 僕もちょっとわからないんだけど。
853デフォルトの名無しさん
2019/12/14(土) 00:21:27.14ID:stptR0oK >>836
デスクトップアプリ
デスクトップアプリ
854デフォルトの名無しさん
2019/12/14(土) 07:31:10.87ID:SZLGcxYz >>846
診断メッセージをよく見ろよ
> error C2737: 'value': 'constexpr' オブジェクトは初期化する必要があります。
そもそも分離できないんだよ
いいか、constexprは翻訳時定数だぞ
それを翻訳段階9まで未解決のままにできると思うか?
診断メッセージをよく見ろよ
> error C2737: 'value': 'constexpr' オブジェクトは初期化する必要があります。
そもそも分離できないんだよ
いいか、constexprは翻訳時定数だぞ
それを翻訳段階9まで未解決のままにできると思うか?
855デフォルトの名無しさん
2019/12/14(土) 08:56:55.09ID:fBoJLlft856デフォルトの名無しさん
2019/12/14(土) 09:02:00.44ID:SZLGcxYz なんでという理由も述べたはずだが
857デフォルトの名無しさん
2019/12/14(土) 09:53:01.66ID:fBoJLlft >>856
だからそれを可能にするようにしてくれ
だからそれを可能にするようにしてくれ
858デフォルトの名無しさん
2019/12/14(土) 10:02:03.90ID:SZLGcxYz ん? 俺は江添じゃねえぞ
奴なら標準会員だから言ってみるのもいいが
奴なら標準会員だから言ってみるのもいいが
859デフォルトの名無しさん
2019/12/14(土) 10:02:27.48ID:SZLGcxYz - 標準会員
+ 標準化委員
+ 標準化委員
860デフォルトの名無しさん
2019/12/14(土) 10:08:29.00ID:yV/FURvf 江添本ダメ絶対
861デフォルトの名無しさん
2019/12/14(土) 10:30:50.58ID:stptR0oK 江添でもできない
862846
2019/12/14(土) 10:35:10.86ID:QUVSvjZy >>854
>診断メッセージをよく見ろよ
見た上で言ってます(つまりgccまたはVC, clangのバグではないかということ
>いいか、constexprは翻訳時定数だぞ
それ以前にテンプレートなんですが
>診断メッセージをよく見ろよ
見た上で言ってます(つまりgccまたはVC, clangのバグではないかということ
>いいか、constexprは翻訳時定数だぞ
それ以前にテンプレートなんですが
863デフォルトの名無しさん
2019/12/14(土) 12:26:05.30ID:m0rD8Ode ローマ法王は根競べで決めるらしいですよ奥さん。
864デフォルトの名無しさん
2019/12/14(土) 12:26:49.81ID:gw9aL+td 誰でも閲覧できる規格ドラフト見ればすぐにわかることをこんな掃きだめで聞いても
865デフォルトの名無しさん
2019/12/14(土) 12:35:13.30ID:SZLGcxYz866デフォルトの名無しさん
2019/12/14(土) 12:50:37.99ID:gw9aL+td >相場では規格票の条文
通産省の癖の抜けない老人はご退場いただきたい
通産省の癖の抜けない老人はご退場いただきたい
867デフォルトの名無しさん
2019/12/14(土) 12:58:43.25ID:m0rD8Ode これODRの緩和と関係あるんですかね?
868デフォルトの名無しさん
2019/12/14(土) 13:34:08.27ID:T/HCOnVQ >>772
>x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ
別に。
コアAの読み書きをコアA自身が見る分にはそうかもわからんが
コアAの読み書きを異なるコアBから見たらwrite同士やread同士でも順番が入れ替わり得る
(アウトオブオーダー実行の影響で
安全に動かすには適切にメモリバリアで順序化する必要がある
>x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ
別に。
コアAの読み書きをコアA自身が見る分にはそうかもわからんが
コアAの読み書きを異なるコアBから見たらwrite同士やread同士でも順番が入れ替わり得る
(アウトオブオーダー実行の影響で
安全に動かすには適切にメモリバリアで順序化する必要がある
869デフォルトの名無しさん
2019/12/14(土) 13:37:18.74ID:JwYnIOEa870デフォルトの名無しさん
2019/12/14(土) 13:37:51.96ID:T/HCOnVQ といってもロックレス何ちゃらぐらいの制御であればInterlockedCompareExchange()で済むから
スレッド間の通信なら普通メモリバリアとか直接触る必要は無いが
スレッド間の通信なら普通メモリバリアとか直接触る必要は無いが
871デフォルトの名無しさん
2019/12/14(土) 13:38:24.93ID:T/HCOnVQ >>869
迷信
迷信
872デフォルトの名無しさん
2019/12/14(土) 13:39:11.91ID:JwYnIOEa ソースは?
873デフォルトの名無しさん
2019/12/14(土) 13:39:40.59ID:T/HCOnVQ リードキューやコマンドキューにコマンドが入るのはアウトオブオーダープロセスの事後であるため
そのような保証は無い
そのような保証は無い
874デフォルトの名無しさん
2019/12/14(土) 13:41:05.07ID:JwYnIOEa それのソース
875デフォルトの名無しさん
2019/12/14(土) 13:44:15.66ID:JwYnIOEa876デフォルトの名無しさん
2019/12/14(土) 14:15:12.84ID:JwYnIOEa x86系は
シングルコアのマルチスレッドアプリ
の多くがそのまま動くように出来てる
シングルコア時代が長かったから
シングルコアのマルチスレッドアプリ
の多くがそのまま動くように出来てる
シングルコア時代が長かったから
877デフォルトの名無しさん
2019/12/14(土) 14:55:10.15ID:QUVSvjZy878デフォルトの名無しさん
2019/12/14(土) 14:57:30.67ID:T/HCOnVQ 確かにリンク先のインテルのマニュアルの
>8.2.3.2 Neither Loads Nor Stores Are Reordered with Like Operations
>Example 8-2. Stores Are Not Reordered with Older Loads
に
>Initially x = y = 0r1 = 1 and r2 = 1 is not allowed
と書いてあって>>875と同じことが書いてあるが疑わしい
マニュアルが間違っているのではないか、
ちな
>8byteのデータはアドレスが8の倍数のときにアライメントされている。
から安全に読み書きできるというのはi486みたいな古いプロセッサーだとかえって危険らしい
>8.1.1 Guaranteed Atomic Operations
を見たらワカル、
>8.2.3.2 Neither Loads Nor Stores Are Reordered with Like Operations
>Example 8-2. Stores Are Not Reordered with Older Loads
に
>Initially x = y = 0r1 = 1 and r2 = 1 is not allowed
と書いてあって>>875と同じことが書いてあるが疑わしい
マニュアルが間違っているのではないか、
ちな
>8byteのデータはアドレスが8の倍数のときにアライメントされている。
から安全に読み書きできるというのはi486みたいな古いプロセッサーだとかえって危険らしい
>8.1.1 Guaranteed Atomic Operations
を見たらワカル、
879デフォルトの名無しさん
2019/12/14(土) 15:04:35.33ID:T/HCOnVQ つか上のインテルのマニュアルには「投機的実行時中のメモリアクセスではメモリアクセス例外は発生しない」
旨が2箇所ぐらいに書かれているが、
ということはつまりアセンブリコード上A→BまたはA→Cというメモリアクセスが条件によってどちら片方だけ実行されることを意図したコードであっても
A→B→Cというメモリアクセス順に成り得ることを意味し、他コアからもそう見えてしまうはずだが、
これをメモリアクセス順がreorderされていないうちに入れてしまうのはどうなのか、、、
マニュアル執筆者の国語の再教育が必要なのではないか
旨が2箇所ぐらいに書かれているが、
ということはつまりアセンブリコード上A→BまたはA→Cというメモリアクセスが条件によってどちら片方だけ実行されることを意図したコードであっても
A→B→Cというメモリアクセス順に成り得ることを意味し、他コアからもそう見えてしまうはずだが、
これをメモリアクセス順がreorderされていないうちに入れてしまうのはどうなのか、、、
マニュアル執筆者の国語の再教育が必要なのではないか
880デフォルトの名無しさん
2019/12/14(土) 15:10:49.52ID:SZLGcxYz >>877
おまえさん、もしかして
テンプレートの宣言と定義と
オブジェクトの宣言と定義を
ごっちゃにしてないか?
int test;
int test = 5;
これは宣言と定義じゃなく定義の重複だぞ
おまえさん、もしかして
テンプレートの宣言と定義と
オブジェクトの宣言と定義を
ごっちゃにしてないか?
int test;
int test = 5;
これは宣言と定義じゃなく定義の重複だぞ
881デフォルトの名無しさん
2019/12/14(土) 15:13:40.23ID:PwUHvw+y お前なぁ
x86のこと大して詳しくないのにしゃしゃり出てくるからそういう情けないこと言うはめになるんだよ
x86でstd::atomicのmemory_orderを変えてバリア付きがどういうインストラクションになるか見てみな
storeのseq_cst以外は素のmovだから(コンパイラ依存だから絶対ではない)
x86のこと大して詳しくないのにしゃしゃり出てくるからそういう情けないこと言うはめになるんだよ
x86でstd::atomicのmemory_orderを変えてバリア付きがどういうインストラクションになるか見てみな
storeのseq_cst以外は素のmovだから(コンパイラ依存だから絶対ではない)
882デフォルトの名無しさん
2019/12/14(土) 15:20:09.00ID:T/HCOnVQ そりゃー間違ったマニュアルにしたがって実装したら間違った実装になり得る(キリ
ていうかアウトオブオーダー実行の影響がマルチコアCPUにおいても透過的だと認めやっても良いが、
>>879の投機的実行の件はどうなんじゃ?
あるコアが投機的実行中に他のコアをストップさせるのでは何のための投機的実行かわからん…
ていうかアウトオブオーダー実行の影響がマルチコアCPUにおいても透過的だと認めやっても良いが、
>>879の投機的実行の件はどうなんじゃ?
あるコアが投機的実行中に他のコアをストップさせるのでは何のための投機的実行かわからん…
883デフォルトの名無しさん
2019/12/14(土) 15:21:14.95ID:k5kIl1RN >>877
× 普通に考えて
〇 俺の頭の中で
× 妥当な理由はない
〇 妥当な理由は思い当たらない
テンプレートなら初期化は不要という主張なら、
constexpr 変数の宣言と定義を分離できないことは納得してるのかな?
そうだとして、それをテンプレートの時だけ可能とすることに意義があると思うの?
特別ルールを設ければコンパイラ実装やプログラムの読み取りにコストがかかるから、
明確が意義がなければ特別ルールは無いのが妥当だと思うよ。
× 普通に考えて
〇 俺の頭の中で
× 妥当な理由はない
〇 妥当な理由は思い当たらない
テンプレートなら初期化は不要という主張なら、
constexpr 変数の宣言と定義を分離できないことは納得してるのかな?
そうだとして、それをテンプレートの時だけ可能とすることに意義があると思うの?
特別ルールを設ければコンパイラ実装やプログラムの読み取りにコストがかかるから、
明確が意義がなければ特別ルールは無いのが妥当だと思うよ。
884デフォルトの名無しさん
2019/12/14(土) 15:24:42.79ID:QUVSvjZy885デフォルトの名無しさん
2019/12/14(土) 15:32:39.86ID:SZLGcxYz >>884
おまえさんの元の質問はこうだったな
template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;
どこにexternなんて書いてある?
マウントがどうたら気にするあまり後出しなんかしてるのはそっちだぞ
こっちはそんなこと微塵も考えちゃいねえよ失敬な
最初の口調に戻れよ
おまえさんの元の質問はこうだったな
template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;
どこにexternなんて書いてある?
マウントがどうたら気にするあまり後出しなんかしてるのはそっちだぞ
こっちはそんなこと微塵も考えちゃいねえよ失敬な
最初の口調に戻れよ
886デフォルトの名無しさん
2019/12/14(土) 15:36:57.55ID:QUVSvjZy 間違えた
Xテンプレート実引数に使われる型が不完全型であっても、実体化まで評価を遅らせられる
○初期化に使われる定数式の評価を遅らせられる
言い換えれば、宣言と定義を分離できないならconstな変数テンプレートの宣言時には
それに使う定数式内のすべての型が完全型であることを強制されてしまう
=std::is_integral_v = std::is_integral<T>::valueでいえば
is_integral構造体の方が取り回しがいい、ということ
なんのために変数テンプレートが導入されたのか・・・・
Xテンプレート実引数に使われる型が不完全型であっても、実体化まで評価を遅らせられる
○初期化に使われる定数式の評価を遅らせられる
言い換えれば、宣言と定義を分離できないならconstな変数テンプレートの宣言時には
それに使う定数式内のすべての型が完全型であることを強制されてしまう
=std::is_integral_v = std::is_integral<T>::valueでいえば
is_integral構造体の方が取り回しがいい、ということ
なんのために変数テンプレートが導入されたのか・・・・
887デフォルトの名無しさん
2019/12/14(土) 15:37:56.58ID:QUVSvjZy888デフォルトの名無しさん
2019/12/14(土) 15:43:43.09ID:SZLGcxYz >>887
template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;
を例示しての質問に対して
int test;
int test = 5;
という答えをしているぞ
valueがtestになったのは悪かったが
余計な飾りをとって問題の核心を指摘したんだよ
template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;
を例示しての質問に対して
int test;
int test = 5;
という答えをしているぞ
valueがtestになったのは悪かったが
余計な飾りをとって問題の核心を指摘したんだよ
889デフォルトの名無しさん
2019/12/14(土) 15:48:43.77ID:SZLGcxYz 家事があるんでしばらく離席する
890デフォルトの名無しさん
2019/12/14(土) 15:58:10.05ID:QUVSvjZy891デフォルトの名無しさん
2019/12/14(土) 16:55:24.17ID:k5kIl1RN >>886
やっぱり constexpr 変数の宣言と定義を分離して何がしたいのか、
何ができるようになるのか、が見えてこない。ごめんね。
宣言だけ見える constexpr 変数への参照やポインタだけはとれるようになるけど、
それだともう constexpr である必要なくて const 変数でよさそうで、それならふつうに
宣言と定義は分けられるし。
ちなみにテンプレート実体化までテンプレート引数依存箇所の評価はされないから、
宣言と定義を分ける話を「評価を遅らせられる」と言い表しているのも何か間違ってそう。
「記述を遅らせられる」の間違い?
やっぱり constexpr 変数の宣言と定義を分離して何がしたいのか、
何ができるようになるのか、が見えてこない。ごめんね。
宣言だけ見える constexpr 変数への参照やポインタだけはとれるようになるけど、
それだともう constexpr である必要なくて const 変数でよさそうで、それならふつうに
宣言と定義は分けられるし。
ちなみにテンプレート実体化までテンプレート引数依存箇所の評価はされないから、
宣言と定義を分ける話を「評価を遅らせられる」と言い表しているのも何か間違ってそう。
「記述を遅らせられる」の間違い?
892デフォルトの名無しさん
2019/12/14(土) 17:16:54.80ID:SZLGcxYz だめだこいつ
絶望的に人に者を尋ねる態度がわかってない
「言ってくれれば済む」とか図々しすぎ
技術的な議論がしたいがこいつ相手では
不必要にイラついちまって無理だわ
俺そんなに人間できてない
絶望的に人に者を尋ねる態度がわかってない
「言ってくれれば済む」とか図々しすぎ
技術的な議論がしたいがこいつ相手では
不必要にイラついちまって無理だわ
俺そんなに人間できてない
893デフォルトの名無しさん
2019/12/14(土) 17:24:00.92ID:QUVSvjZy >>891
すまん、
>テンプレート実体化までテンプレート引数依存箇所の評価はされない
これ検証してみたらたしかにそうだった
手元のコードで完全型を要求されたから、初期化時に不完全型を使えないと思い込んでた
(おそらくconstexprな変数テンプレートの実体化が、必要な型の実体化より先に来てたっぽい
多分構造体か何かでワンクッション置けば解決できると思う)
これなら確かに分けられなくて問題無いね
>>892
>いいか、constexprは翻訳時定数だぞ
>それを翻訳段階9まで未解決のままにできると思うか?
>なんかとんがってんな
>後出しなんかしてるのはそっちだ
>余計な飾りをとって問題の核心を指摘したんだよ
さらには
>最初の口調に戻れよ
の上で
>技術的な議論がしたいがこいつ相手では
>不必要にイラついちまって無理だわ
よくそんなセリフが言えたもんだ
自己評価高すぎじゃない?wwww
すまん、
>テンプレート実体化までテンプレート引数依存箇所の評価はされない
これ検証してみたらたしかにそうだった
手元のコードで完全型を要求されたから、初期化時に不完全型を使えないと思い込んでた
(おそらくconstexprな変数テンプレートの実体化が、必要な型の実体化より先に来てたっぽい
多分構造体か何かでワンクッション置けば解決できると思う)
これなら確かに分けられなくて問題無いね
>>892
>いいか、constexprは翻訳時定数だぞ
>それを翻訳段階9まで未解決のままにできると思うか?
>なんかとんがってんな
>後出しなんかしてるのはそっちだ
>余計な飾りをとって問題の核心を指摘したんだよ
さらには
>最初の口調に戻れよ
の上で
>技術的な議論がしたいがこいつ相手では
>不必要にイラついちまって無理だわ
よくそんなセリフが言えたもんだ
自己評価高すぎじゃない?wwww
894デフォルトの名無しさん
2019/12/14(土) 17:52:18.36ID:SZLGcxYz 意見が合うとか合わないとか以前の問題
根底的なメンタリティに欠陥がある相手とは話にならない
根底的なメンタリティに欠陥がある相手とは話にならない
895デフォルトの名無しさん
2019/12/14(土) 17:58:45.99ID:k5kIl1RN FYI
>>846
Bug 68012: g++ incorrectly accepts forward declaration of constexpr variable template
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68012
>>848
One definition rule
https://timsong-cpp.github.io/cppwp/n4659/basic.def.odr#1
> No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.
>>846
Bug 68012: g++ incorrectly accepts forward declaration of constexpr variable template
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68012
>>848
One definition rule
https://timsong-cpp.github.io/cppwp/n4659/basic.def.odr#1
> No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.
896デフォルトの名無しさん
2019/12/14(土) 18:08:23.02ID:QUVSvjZy >>895
わざわざありがとう、やっぱgccのバグだったのね
わざわざありがとう、やっぱgccのバグだったのね
897デフォルトの名無しさん
2019/12/14(土) 19:50:50.54ID:UskLmxJI GCCに踊らされてスレを浪費した
898デフォルトの名無しさん
2019/12/14(土) 20:04:04.94ID:4qfYuBec899デフォルトの名無しさん
2019/12/14(土) 21:11:37.22ID:zf7JKoX1900デフォルトの名無しさん
2019/12/14(土) 21:15:53.72ID:SZLGcxYz 禿もそんなことを言いながら
virtualの導入には当初反対から出発したんだよな
virtualの導入には当初反対から出発したんだよな
901デフォルトの名無しさん
2019/12/14(土) 21:26:53.87ID:00Pm6Tju >>899
その話題QZ相手にやったばかりなんで自分で調べて
その話題QZ相手にやったばかりなんで自分で調べて
902デフォルトの名無しさん
2019/12/15(日) 09:10:03.56ID:LATD77rz 君が忘れた腕時計見つめながら。
903デフォルトの名無しさん
2019/12/15(日) 10:29:35.56ID:ir8W/KPm >>898
overload は、同じ関数名で仮引数の型が違う関数を作れるという多態性のことですよ。
overload は、同じ関数名で仮引数の型が違う関数を作れるという多態性のことですよ。
904デフォルトの名無しさん
2019/12/15(日) 10:52:20.53ID:LATD77rz ツリーのイテレータがあるとして、イテレータが返すのはノードじゃなくて、ノードの持つ値ですよね?
すると、イテレータは立体機動出来ないといけなくなるけど、begin().begin()とか変ですよね?
begin().parent()とか。
すると、イテレータは立体機動出来ないといけなくなるけど、begin().begin()とか変ですよね?
begin().parent()とか。
905デフォルトの名無しさん
2019/12/15(日) 10:59:28.89ID:LATD77rz イテレータが返すじゃなくて、イテレータの逆参照が返すかな。
906デフォルトの名無しさん
2019/12/15(日) 11:08:51.65ID:fGq+HT2S コレクションとしては子孫ノード全部を列挙できればよくて、ツリー構造に沿った操作が行いたいなら
それに加えて直接の子ノードのみを列挙するイテレータが用意できればいいだろう。
それに加えて直接の子ノードのみを列挙するイテレータが用意できればいいだろう。
907デフォルトの名無しさん
2019/12/15(日) 11:17:54.16ID:LATD77rz 何が子ノードのみを列挙するイテレータを返すかがよくわからない。
ノードの値がイテレータを返すことはできないので、ノードが子ノードを指すイテレータを返すとすると、イテレータの逆参照はノードを返すことになる。
これは意味論的にちょっと違うかなって。
コレクションにおいて位置はイテレータで示されるので、立体的な位置を持つツリーでは、イテレータ自身が立体機動出来て、巡回能力を持つイテレータは、reverse_iteratorのように外部に用意されれば良いのかなと思ったんだけど。
たとえば、レベルオーダーや深さ優先の巡回イテレータがあるとすると、普通に考えるとスタックやキューが内部に必要にある。
というわけでコピーのコストがあるので、これを標準には出来ないんじゃないかなって。
ノードの値がイテレータを返すことはできないので、ノードが子ノードを指すイテレータを返すとすると、イテレータの逆参照はノードを返すことになる。
これは意味論的にちょっと違うかなって。
コレクションにおいて位置はイテレータで示されるので、立体的な位置を持つツリーでは、イテレータ自身が立体機動出来て、巡回能力を持つイテレータは、reverse_iteratorのように外部に用意されれば良いのかなと思ったんだけど。
たとえば、レベルオーダーや深さ優先の巡回イテレータがあるとすると、普通に考えるとスタックやキューが内部に必要にある。
というわけでコピーのコストがあるので、これを標準には出来ないんじゃないかなって。
908デフォルトの名無しさん
2019/12/15(日) 11:22:50.93ID:LATD77rz 子ノードを指すイテレータの逆参照が子ノードを返すとすると、*node.begin()は子ノードを返す。
**node.begin()は最初の子ノードの値を返すことになるんだけども。
イテレータの逆参照がノードを返す場合、初期化子リストが素直に実装出来てイイんだけども、イテレータの逆参照が値を返さないのが腑に落ちない感じ。
**node.begin()は最初の子ノードの値を返すことになるんだけども。
イテレータの逆参照がノードを返す場合、初期化子リストが素直に実装出来てイイんだけども、イテレータの逆参照が値を返さないのが腑に落ちない感じ。
909デフォルトの名無しさん
2019/12/15(日) 11:23:28.40ID:Q+saMC6e910デフォルトの名無しさん
2019/12/15(日) 11:27:25.99ID:LATD77rz イテレータは演算子の実装を求められてるわけではなく、その演算子を呼び出した時の効果を求められてるだけなので、++(int)はスタックをコピーしない方法を考えた。
911デフォルトの名無しさん
2019/12/15(日) 11:30:57.88ID:fGq+HT2S そこは値じゃなくてノードを返すイテレータでいいんじゃね?
必要ならイテレータ自体を拡張してもいいだろうけど、この場合はあまり応用できそうもないし。
必要ならイテレータ自体を拡張してもいいだろうけど、この場合はあまり応用できそうもないし。
912デフォルトの名無しさん
2019/12/15(日) 11:31:53.05ID:LATD77rz そうなのかな?
913デフォルトの名無しさん
2019/12/15(日) 11:37:55.15ID:PfQY9kAx まずイテレータで何を抽象化したいかを明確にしなよ
ノードを意識させたいのか?
ノードを意識させたいのか?
914デフォルトの名無しさん
2019/12/15(日) 11:38:38.78ID:LATD77rz STL風ツリーって検索しても絶対出てこないし、CIAが絡んでるような気がしてきた。
915デフォルトの名無しさん
2019/12/15(日) 11:39:36.48ID:LATD77rz そこがわかんないんだよねえ。
禿4とか読んでると、イテレータは位置を意味してるように思うんだけど。
禿4とか読んでると、イテレータは位置を意味してるように思うんだけど。
916デフォルトの名無しさん
2019/12/15(日) 11:45:00.74ID:mSzJWPy5 ツリー構造
範囲が広すぎて
汎用化すると使い勝手が悪くなるからしない
ってだけかと
範囲が広すぎて
汎用化すると使い勝手が悪くなるからしない
ってだけかと
917デフォルトの名無しさん
2019/12/15(日) 11:56:45.76ID:Q+saMC6e recursive_directory_iteratorとかね
918デフォルトの名無しさん
2019/12/15(日) 12:06:14.82ID:mSzJWPy5 なんでdirectory?
treeでいいじゃん
treeでいいじゃん
919デフォルトの名無しさん
2019/12/15(日) 12:22:05.91ID:Q+saMC6e いや立体がどうたら言ってるから
じゃあrecursive_directory_iteratorを使うユーザーのコードは
いちいち多重ループだの再帰だのといった処理になるのかって
思ってさ
じゃあrecursive_directory_iteratorを使うユーザーのコードは
いちいち多重ループだの再帰だのといった処理になるのかって
思ってさ
920デフォルトの名無しさん
2019/12/15(日) 12:24:23.41ID:LATD77rz ツリーは、あるノードの親が知りたいときもあるはず。
921デフォルトの名無しさん
2019/12/15(日) 13:07:24.45ID:TeOOTcIs ごちゃごちゃ考える前にイテレータの本分を決めなよ
begin()からend()まで++で走らせた時にどうなってほしいの?
話はそれからだ
begin()からend()まで++で走らせた時にどうなってほしいの?
話はそれからだ
922デフォルトの名無しさん
2019/12/15(日) 13:09:44.18ID:MBW+LfoG 一般にtreeの探索順序はアルゴリズムと深く結びついてるし、
そこ凝りだすと沼だぞ。
そこ凝りだすと沼だぞ。
923デフォルトの名無しさん
2019/12/15(日) 13:09:51.26ID:5G1zfwod 関数ポインタをシリアライズしてファイルとして保存し、
ファイルからその関数ポインタを利用できる形に復元する方法ってあるのでしょうか?
ファイルからその関数ポインタを利用できる形に復元する方法ってあるのでしょうか?
924デフォルトの名無しさん
2019/12/15(日) 13:13:54.57ID:nhcuVJi8 関数だろうが変数だろうがポインタはただの整数値でしょ
925デフォルトの名無しさん
2019/12/15(日) 13:18:39.25ID:p2D9PeH2 >>923 環境や「利用」の仕方を具体的に限定すればやりようはあるかもね。
926デフォルトの名無しさん
2019/12/15(日) 13:20:48.30ID:hicN34V0 次に(別のプロセスで)ファイルを読み込んだときに、
元の関数を同じ番地で参照できると限らんしな。
関数ポインタの配列のインデクスなら大丈夫だろうだけど。
元の関数を同じ番地で参照できると限らんしな。
関数ポインタの配列のインデクスなら大丈夫だろうだけど。
927デフォルトの名無しさん
2019/12/15(日) 13:23:00.95ID:LATD77rz https://ja.cppreference.com/w/cpp/iterator/reverse_iterator/operator%3D
これconstexprになってるけど、どういうときに定数になるんだろ?
end()の時かな?
これconstexprになってるけど、どういうときに定数になるんだろ?
end()の時かな?
928デフォルトの名無しさん
2019/12/15(日) 13:39:23.84ID:2FA7t6Jx C++20以降のvector/stringとか
使われる時にconstexprであることを妨げないようにするために付いてるんだと思う
使われる時にconstexprであることを妨げないようにするために付いてるんだと思う
929デフォルトの名無しさん
2019/12/15(日) 13:47:38.10ID:LATD77rz どうもありがとう。
930デフォルトの名無しさん
2019/12/15(日) 13:52:49.06ID:ph9lwYgM constexpr関数の中で使うため。
931デフォルトの名無しさん
2019/12/15(日) 14:30:37.97ID:o9m7qUoD デストラクタがデフォルトでvirtualじゃないのは設計不良ではあるまいか
932デフォルトの名無しさん
2019/12/15(日) 14:34:47.01ID:EeC59mXx あえてベースの方のメソッドを呼びたいなんてことあるのかね?
933デフォルトの名無しさん
2019/12/15(日) 14:38:17.75ID:p2D9PeH2934デフォルトの名無しさん
2019/12/15(日) 15:15:03.49ID:K1ul1r/C >>931
C++では基本的にゼロコストでできるところはそうできるようにするポリシーだからvirtualが必要なときだけvirtualを明示的に指定させる、というのをどこかで読んだ気がする
C++では基本的にゼロコストでできるところはそうできるようにするポリシーだからvirtualが必要なときだけvirtualを明示的に指定させる、というのをどこかで読んだ気がする
935デフォルトの名無しさん
2019/12/15(日) 15:29:48.68ID:7Mmj/dyw virtualでなかったら継承禁止にしても良かったんじゃないかとは思う
936デフォルトの名無しさん
2019/12/15(日) 16:19:56.16ID:AolOnHel そうするとメタプログラミングに色々と支障が出たはずだし
STLも結構継承使ってるから実現出来なかったかコスト増えてるよ
STLも結構継承使ってるから実現出来なかったかコスト増えてるよ
937デフォルトの名無しさん
2019/12/15(日) 16:52:10.11ID:TkLVy9px デストラクタをvirtualにする必要があるのは、baseのポインタ経由でdeleteする場合だけ
baseのポインタを使うことすらないようなもの(CRTPなど)までvirtualになるのは
どうなんだろうか
baseのポインタを使うことすらないようなもの(CRTPなど)までvirtualになるのは
どうなんだろうか
938デフォルトの名無しさん
2019/12/15(日) 17:01:04.52ID:ph9lwYgM unique_ptr使えばvirtualにする必要無いのでは?
939デフォルトの名無しさん
2019/12/15(日) 17:16:05.58ID:p2D9PeH2 >>938 んなこたーない。
shared_ptr<Base>{new Derived} なら virtual デストラクタ不要になるから、間違えて覚えてるだけでは?
shared_ptr<Base>{new Derived} なら virtual デストラクタ不要になるから、間違えて覚えてるだけでは?
940デフォルトの名無しさん
2019/12/15(日) 18:59:53.87ID:tmrMX5L5941デフォルトの名無しさん
2019/12/15(日) 19:10:50.35ID:AolOnHel セオリーとして覚えてる人多いけど、何故なのかまで考えてない人が多い例の一つだね
要するにdeleteする基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ
末端のデストラクタを呼べれば、そこから基底のデストラクタを呼んでいくのは何が基底かわかりきってるから自動で出来る
要するにdeleteする基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ
末端のデストラクタを呼べれば、そこから基底のデストラクタを呼んでいくのは何が基底かわかりきってるから自動で出来る
942デフォルトの名無しさん
2019/12/15(日) 19:29:34.24ID:tmrMX5L5 永遠の初心者です、お願いします
1. 式で if 文を表現したいときは条件演算子(三項演算子 ?: )が使えますが、同じく式でループ構造を表す方法は C++11 以後にありますでしょうか?
2. 1 の質問の理由としては、C++ は Java とちがって uper() がなく、派生クラスのコンストラクタの基底クラス初期化部分に式しか書けません、ここにループを書くとすれば「コンストラクタ用メンバ関数(メソッド)」を置いていますがいかにも無様だと思っています…
3. ある既存のクラスに皮をかぶせて機能アップを図るとき、もとのクラスの派生クラスとして機能アップ部分を既述することは、よくある定石でしょうか、それともあまりしないことでしょうか?
---
以上3点の質問は以下のプログラムを書いていて感じました
お題は「エラトステネスのふるい」、ただし、当初、まっとうにふるいを書いた後、機能アップ項目として
篩部分に格納する数は 2n + 1 奇数に限定する、あるいは 6n + 1, 6n + 5 の形のみに限定する
等を元の篩に対して派生クラスとして記述しました
https://ideone.com/YPlfsC
1. 式で if 文を表現したいときは条件演算子(三項演算子 ?: )が使えますが、同じく式でループ構造を表す方法は C++11 以後にありますでしょうか?
2. 1 の質問の理由としては、C++ は Java とちがって uper() がなく、派生クラスのコンストラクタの基底クラス初期化部分に式しか書けません、ここにループを書くとすれば「コンストラクタ用メンバ関数(メソッド)」を置いていますがいかにも無様だと思っています…
3. ある既存のクラスに皮をかぶせて機能アップを図るとき、もとのクラスの派生クラスとして機能アップ部分を既述することは、よくある定石でしょうか、それともあまりしないことでしょうか?
---
以上3点の質問は以下のプログラムを書いていて感じました
お題は「エラトステネスのふるい」、ただし、当初、まっとうにふるいを書いた後、機能アップ項目として
篩部分に格納する数は 2n + 1 奇数に限定する、あるいは 6n + 1, 6n + 5 の形のみに限定する
等を元の篩に対して派生クラスとして記述しました
https://ideone.com/YPlfsC
944デフォルトの名無しさん
2019/12/15(日) 20:01:24.23ID:01f7hQnX >>943
ラムダ式の出番かな?
void test(bool flag) { flag ? []{ for(int i = 0; i < 10; ++i) cout << i; } : throw 1; }
ラムダ式の出番かな?
void test(bool flag) { flag ? []{ for(int i = 0; i < 10; ++i) cout << i; } : throw 1; }
945デフォルトの名無しさん
2019/12/15(日) 20:05:17.27ID:5sPbacoo エラストテネス
6n+1, 6n+5だけ保持とかってみんな考えるよね
ちなみに
巨大なテーブル作成時のパフォーマンスを上げるなら
キャッシュが効くよう分割処理するのが非常に効果的
スレッド分割の為にいずれにしろ分割処理は作る事になる
6n+1, 6n+5だけ保持とかってみんな考えるよね
ちなみに
巨大なテーブル作成時のパフォーマンスを上げるなら
キャッシュが効くよう分割処理するのが非常に効果的
スレッド分割の為にいずれにしろ分割処理は作る事になる
946デフォルトの名無しさん
2019/12/15(日) 20:07:01.24ID:5sPbacoo エラトステネス
947デフォルトの名無しさん
2019/12/15(日) 20:14:20.76ID:mkXjftMX 高分子エラストマー
948はちみつ餃子 ◆8X2XSCHEME
2019/12/15(日) 20:20:59.00ID:jthcUe0A >>943
初期化部分に複雑な処理をベタ書きする方が無様だと思うよ。
初期化リストの中にそんなごちゃごちゃしたこと書きたい?
ワイが思うだけなので世間でどう思われてるかは知らんけどとりあえずひとつの意見として。
初期化部分に複雑な処理をベタ書きする方が無様だと思うよ。
初期化リストの中にそんなごちゃごちゃしたこと書きたい?
ワイが思うだけなので世間でどう思われてるかは知らんけどとりあえずひとつの意見として。
949デフォルトの名無しさん
2019/12/15(日) 20:54:13.00ID:TKBas8kS >>939
親クラス(Base)のデストラクタに virtual 付けなくても...
{
shared_ptr<Base> obj( new Derived() );
} // ~Derived() called, then ~Base() called.
~Derived() はコールされるんですね... 確認してみて驚きました。
これができる仕組みを誰か教えてください。
スマートポインタのオブジェクトは子クラスの事何も知らないのに
どうして ~Derived() のコールが可能なのでしょうか?
親クラス(Base)のデストラクタに virtual 付けなくても...
{
shared_ptr<Base> obj( new Derived() );
} // ~Derived() called, then ~Base() called.
~Derived() はコールされるんですね... 確認してみて驚きました。
これができる仕組みを誰か教えてください。
スマートポインタのオブジェクトは子クラスの事何も知らないのに
どうして ~Derived() のコールが可能なのでしょうか?
レス数が900を超えています。1000を超えると表示できなくなるよ。
ニュース
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- 【野球】野球の未来に危機感「マイナースポーツになる」 宮本慎也氏が開催…学童大会 [尺アジ★]
- 中国「捜索レーダー起動は各国の通常の手法」 火器管制用か回答せず [蚤の市★]
- 【訃報】声優・西村知道さん死去 「SLAM DUNK」安西先生役 9月に体調不良のため一時休業 [少考さん★]
- 【愛国者速報】山上徹也、金に困りTwitterのお金配り垢に応募していた。犯行もお金があったら暫くやらなかったと供述 [856698234]
- 防衛省関係者「中国軍のレーダー照射は現場の忖度か暴走だろう」 [834922174]
- マヨネーズにわさび、山椒、卵の黄身、ラー油、オリーブオイルを入れてよく混ぜてください
- 千晴とVIPの深夜の遊戯
- 全力疾走してる人同士が正面からぶつかったら最悪どうなるんだろう
- 巨大地震 [957955821]
