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
822デフォルトの名無しさん
2019/12/12(木) 23:02:50.75ID:+RpJiFi7 jsてのは女子小学生の意味か?
823デフォルトの名無しさん
2019/12/12(木) 23:04:10.87ID:hmkgwwLY 型が無いと僕たちには辛すぎるよね。
ミスを発見してくれないから。
ミスを発見してくれないから。
824デフォルトの名無しさん
2019/12/12(木) 23:36:51.22ID:Rc7qy7fw 型はまあ重要だけど型ガーばっか言ってる奴は揃ってバカだよな。
825デフォルトの名無しさん
2019/12/13(金) 00:21:19.32ID:0IHjBlJG 型が無いとinsertがinsert_from_intとかinsert_from_stringとか別々にしないといけなくなって、色々大変そう。
呼び出し側が責任を持つということになるのかも。
呼び出し側が責任を持つということになるのかも。
826デフォルトの名無しさん
2019/12/13(金) 00:22:24.50ID:0IHjBlJG 型演算をコンパイラに任せることが出来なくなって、すべてプログラミングしないといけなくなるのかな。
827デフォルトの名無しさん
2019/12/13(金) 06:47:47.05ID:6WB0hlYg828デフォルトの名無しさん
2019/12/13(金) 07:17:35.68ID:0IHjBlJG 機械語は変数に型がない。
命令で型を使い分ける。
その大変さを考えると型欲しいってなるのかも。
命令で型を使い分ける。
その大変さを考えると型欲しいってなるのかも。
829デフォルトの名無しさん
2019/12/13(金) 07:24:37.08ID:Ry/2QtNy まさにBがCに進化するときの考え方だね
830デフォルトの名無しさん
2019/12/13(金) 09:49:21.00ID:wVkcEFxk >>825
ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
用意して使うと言う発想はスクリプト言語的な発想。
そのようにした場合、コンパイラが厳密にどの関数を使うかが人間には
分からない事が多いので安全性を損なう場合が多い。
スクリプト言語は RAD言語なのため、できるだけ短い関数名で対処しようと
するが、それが思わぬ間違いを含みがち。
C言語が好かれているのは、どういう処理がされるかが人間が完全予測できる
ことで、「大体の動作」は好まれない。
ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
用意して使うと言う発想はスクリプト言語的な発想。
そのようにした場合、コンパイラが厳密にどの関数を使うかが人間には
分からない事が多いので安全性を損なう場合が多い。
スクリプト言語は RAD言語なのため、できるだけ短い関数名で対処しようと
するが、それが思わぬ間違いを含みがち。
C言語が好かれているのは、どういう処理がされるかが人間が完全予測できる
ことで、「大体の動作」は好まれない。
831デフォルトの名無しさん
2019/12/13(金) 09:53:03.46ID:wVkcEFxk >>826
型の違いでコードを自動変化させるという思想は、C++の中でも非常に最近に
なって STL (template) で流行りだしたもの。
もともとC言語に型が導入されたのは、プログラマのミスをコンパイラが発見して
エラーを出してくれるようにするためだった。C言語には関数の多態性(overload)
がない。なお、override と overload は別の概念なので、知らない人は検索して
欲しい。
型の違いでコードを自動変化させるという思想は、C++の中でも非常に最近に
なって STL (template) で流行りだしたもの。
もともとC言語に型が導入されたのは、プログラマのミスをコンパイラが発見して
エラーを出してくれるようにするためだった。C言語には関数の多態性(overload)
がない。なお、override と overload は別の概念なので、知らない人は検索して
欲しい。
832デフォルトの名無しさん
2019/12/13(金) 09:53:50.44ID:0IHjBlJG イネーブラ使えば良いのでは。
833デフォルトの名無しさん
2019/12/13(金) 10:00:20.89ID:0IHjBlJG コンセプトコイコイって感じなのかな。
834デフォルトの名無しさん
2019/12/13(金) 11:27:07.79ID:WVlIRY9+ #pragma omp parallel forで
自動分割され、各スレッドに割り当てられた
ループの開始点と終了点を取得することできませんか?
自動分割され、各スレッドに割り当てられた
ループの開始点と終了点を取得することできませんか?
835デフォルトの名無しさん
2019/12/13(金) 18:09:24.89ID:e6j7CnOm >C言語には関数の多態性(overload)がない
さらりと嘘をつくやつがおるな
さらりと嘘をつくやつがおるな
836デフォルトの名無しさん
2019/12/13(金) 18:27:30.70ID:fi1/rC5j 今UE4と組み込み以外でc++の仕事あります?
837デフォルトの名無しさん
2019/12/13(金) 18:33:53.16ID:xTSwswyu オーバーロードあるか?
ディスパッチの方法はいろいろあると思うが
ディスパッチの方法はいろいろあると思うが
838デフォルトの名無しさん
2019/12/13(金) 18:55:58.62ID:ftjAwgQI >>836
USのマイクロソフトに行け
USのマイクロソフトに行け
839デフォルトの名無しさん
2019/12/13(金) 19:01:03.38ID:ysGzQi5M >>830
> ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
> 用意して使うと言う発想はスクリプト言語的な発想。
え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
「同じ関数名の関数を複数用意」できるのは静的型付け言語の特徴だよ
> ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
> 用意して使うと言う発想はスクリプト言語的な発想。
え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
「同じ関数名の関数を複数用意」できるのは静的型付け言語の特徴だよ
840デフォルトの名無しさん
2019/12/13(金) 19:52:22.32ID:6WB0hlYg841デフォルトの名無しさん
2019/12/13(金) 20:00:57.46ID:ysGzQi5M PowrShell は型付言語ですからね。
それぐらいでしょ?
それぐらいでしょ?
842はちみつ餃子 ◆8X2XSCHEME
2019/12/13(金) 20:54:52.57ID:1q9LzdDI 用語としてメソッドと言ってるものでよければ Common Lisp もそうじゃね?
843デフォルトの名無しさん
2019/12/13(金) 21:07:31.92ID:KHLl2/ku844デフォルトの名無しさん
2019/12/13(金) 21:09:15.79ID:wKYhuojH845デフォルトの名無しさん
2019/12/13(金) 21:13:12.55ID:gmdEaqRD それでいいんじゃないの
846デフォルトの名無しさん
2019/12/13(金) 21:23:18.13ID:T1rtAOWF 質問です
template <typename T>
constexpr inline T value;
template <typename T>
constexpr inline T value = (T)0;
こうやって変数テンプレートの宣言と初期化を分離すると
VC、clang(Xcode付属)ではエラーになるんですがwandboxで試すとエラーになりません
本来どっちの動作が正しいんでしょうか?
template <typename T>
constexpr inline T value;
template <typename T>
constexpr inline T value = (T)0;
こうやって変数テンプレートの宣言と初期化を分離すると
VC、clang(Xcode付属)ではエラーになるんですがwandboxで試すとエラーになりません
本来どっちの動作が正しいんでしょうか?
847デフォルトの名無しさん
2019/12/13(金) 21:37:57.11ID:KHLl2/ku848デフォルトの名無しさん
2019/12/13(金) 22:26:34.23ID:0IHjBlJG >>846
これも通ってしまった。
#include <iostream>
template <typename T>
constexpr T value = 1;
template <typename T>
constexpr T value = 2;
template <typename T>
constexpr T value = 3;
template <typename T>
constexpr T value = 4;
template <typename T>
constexpr T value = 5;
template <typename T>
constexpr T value = 6;
int main()
{
std::cout << value<int> << std::endl;
}
これも通ってしまった。
#include <iostream>
template <typename T>
constexpr T value = 1;
template <typename T>
constexpr T value = 2;
template <typename T>
constexpr T value = 3;
template <typename T>
constexpr T value = 4;
template <typename T>
constexpr T value = 5;
template <typename T>
constexpr T value = 6;
int main()
{
std::cout << value<int> << std::endl;
}
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()まで++で走らせた時にどうなってほしいの?
話はそれからだ
レス数が900を超えています。1000を超えると表示できなくなるよ。
