!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
C++相談室 part161
https://mevius.5ch.net/test/read.cgi/tech/1653135809/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C++相談室 part162
レス数が1000を超えています。これ以上書き込みはできません。
1sage (ワッチョイ fbf0-ofdD)
2022/10/31(月) 14:29:35.57ID:J5sgTSch02デフォルトの名無しさん (ワッチョイ d9f0-ofdD)
2022/10/31(月) 17:11:42.28ID:FSs0hrWX0 保守です
3デフォルトの名無しさん (スップ Sd73-OvbD)
2022/11/01(火) 07:31:00.75ID:8mAHYLmxd 寿限無寿限無五劫の擦り切れ海砂利水魚の水行末雲来末風来末食う寝る処に住む処藪ら柑子の藪柑子パイポパイポ パイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナーの長久命の長助
4デフォルトの名無しさん (スップ Sd73-pLSs)
2022/11/01(火) 12:22:19.23ID:LNKvo44sd 今更話すことある?
5デフォルトの名無しさん (ワッチョイ 79c2-iO6U)
2022/11/03(木) 09:15:40.37ID:AvIGv7Uk0 template <template<class...> class T>
struct is_map : std::false_type { };
template<> struct is_map<std::map> : std::true_type { };
template<> struct is_map<std::multimap> : std::true_type { };
template<> struct is_map<std::unordered_map> : std::true_type { };
template<> struct is_map<std::unordered_multimap> : std::true_type { };
template <template<class...> class T>
concept map_t = is_map<T>::value;
template <template<class...> map_t MAP, class... ARGS> //C3339
void test(MAP<ARGS...>&&) {}
うーん、困った
どうしよう。。。
struct is_map : std::false_type { };
template<> struct is_map<std::map> : std::true_type { };
template<> struct is_map<std::multimap> : std::true_type { };
template<> struct is_map<std::unordered_map> : std::true_type { };
template<> struct is_map<std::unordered_multimap> : std::true_type { };
template <template<class...> class T>
concept map_t = is_map<T>::value;
template <template<class...> map_t MAP, class... ARGS> //C3339
void test(MAP<ARGS...>&&) {}
うーん、困った
どうしよう。。。
6デフォルトの名無しさん (ワッチョイ 917c-T8wd)
2022/11/03(木) 10:13:40.98ID:GMyBvZ220 requires map_t<MAP>でええやん
7デフォルトの名無しさん (ワッチョイ 79c2-iO6U)
2022/11/03(木) 10:30:49.88ID:AvIGv7Uk0 あ、そっか
㌧x
一応、報告
template <template<class...> class MAP, class... ARGS> requires map_t<MAP> //OK
void test(MAP<ARGS...>&&) {}
㌧x
一応、報告
template <template<class...> class MAP, class... ARGS> requires map_t<MAP> //OK
void test(MAP<ARGS...>&&) {}
8デフォルトの名無しさん (ワッチョイ 0bda-PhZD)
2022/11/03(木) 18:33:03.71ID:A3AnwOcy0 テンプレートにテンプレート重ねて滅茶苦茶する典型
9デフォルトの名無しさん (ワッチョイ 917c-T8wd)
2022/11/03(木) 20:41:25.83ID:GMyBvZ220 AssociativeContainer要件のコンセプトは標準ライブラリには無いんだな
規格上定義してるrequirementは一通り作っとけばいいのに
規格上定義してるrequirementは一通り作っとけばいいのに
10デフォルトの名無しさん (ワッチョイ 13a5-T+yX)
2022/11/03(木) 22:05:17.66ID:f0rgVbxY011はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7b3e-Tk+f)
2022/11/03(木) 22:28:39.04ID:b1nVlp4p0 >>10
コンパイラが無限のリソースを使えるわけじゃないから制限があってもいいし、
わかっている制限は文書化するべきということになっている。
https://timsong-cpp.github.io/cppwp/n3337/implimits
言語仕様の側でもどの程度まで処理すべきかという最低限の数値は与えていて
この場合だと
Recursively nested template instantiations [1024].
ってのが当てはまる。
あくまでもガイドラインなのでこれ以下に制限された処理系がないとは言えないんだけど、
1024 が提示されているところで 100 やそこらに制限するような処理系はたぶんあんまりないとは期待できると思う。
コンパイラが無限のリソースを使えるわけじゃないから制限があってもいいし、
わかっている制限は文書化するべきということになっている。
https://timsong-cpp.github.io/cppwp/n3337/implimits
言語仕様の側でもどの程度まで処理すべきかという最低限の数値は与えていて
この場合だと
Recursively nested template instantiations [1024].
ってのが当てはまる。
あくまでもガイドラインなのでこれ以下に制限された処理系がないとは言えないんだけど、
1024 が提示されているところで 100 やそこらに制限するような処理系はたぶんあんまりないとは期待できると思う。
12デフォルトの名無しさん (ワッチョイ 79c2-iO6U)
2022/11/04(金) 14:22:03.44ID:MccBwaps0 そんなん言い出したら自動変数は合計何バイトまでとか
しょーもないことを規格票に書くハメにならないか?
しょーもないことを規格票に書くハメにならないか?
13デフォルトの名無しさん (ワッチョイ 8901-T+yX)
2022/11/04(金) 14:28:53.41ID:I5Ua2kB10 GCCとClangの -ftemplate-depth-?? の話?
14デフォルトの名無しさん (スッップ Sd33-pLSs)
2022/11/04(金) 15:45:10.91ID:nV9i8Ccmd 昔は17だったなその制限
15デフォルトの名無しさん (ワッチョイ 79c2-iO6U)
2022/11/04(金) 16:29:55.40ID:MccBwaps0 つーかよ
俺5だけど、あの程度のことで
8みたいなこと言われたのずっこけてる
別に無駄に複雑化はしてないし裏技も使ってない
当たり前の書き方で目的を素直に書いてるだけなのに
一次テンプレートと特殊化でis_系のクエリーを作って
それでコンセプト作って使おうとしただけだぜ?
何があかんの?
テンプレートテンプレート仮引数がわからんだけじゃないのかって邪推しちまいそう
俺5だけど、あの程度のことで
8みたいなこと言われたのずっこけてる
別に無駄に複雑化はしてないし裏技も使ってない
当たり前の書き方で目的を素直に書いてるだけなのに
一次テンプレートと特殊化でis_系のクエリーを作って
それでコンセプト作って使おうとしただけだぜ?
何があかんの?
テンプレートテンプレート仮引数がわからんだけじゃないのかって邪推しちまいそう
16デフォルトの名無しさん (スッップ Sd33-pLSs)
2022/11/04(金) 16:49:46.97ID:nV9i8Ccmd 全然あかんくないと思うよ
8がアホなだけ
8がアホなだけ
17デフォルトの名無しさん (ワッチョイ 8901-T+yX)
2022/11/04(金) 18:04:41.45ID:I5Ua2kB1018デフォルトの名無しさん (ワッチョイ 8901-T+yX)
2022/11/04(金) 18:07:42.31ID:I5Ua2kB1019はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7b3e-Tk+f)
2022/11/04(金) 19:44:51.78ID:lXYNWX4U0 制限はあくまでも「深さ」であって「回数」ではないので上手いこと変形するのも技の内だったんだよな……。
遊びでやるならきつめの制限も楽しいんだけどね。
遊びでやるならきつめの制限も楽しいんだけどね。
20デフォルトの名無しさん (ワッチョイ f61f-0tFf)
2022/11/05(土) 15:23:46.47ID:6woT7hPv0 自動的に解釈されるテンプレート引数で
値渡しじゃなく参照渡しと解釈させる方法ってありますかね?
値渡しじゃなく参照渡しと解釈させる方法ってありますかね?
21デフォルトの名無しさん (スフッ Sdb2-hVB7)
2022/11/05(土) 15:33:58.60ID:95t5abQGd std::ref
std::cref
std::cref
22デフォルトの名無しさん (ワッチョイ f61f-0tFf)
2022/11/05(土) 15:40:28.55ID:6woT7hPv0 あるんですねぇ
ありがとうございます
ありがとうございます
23デフォルトの名無しさん (テテンテンテン MM96-REjG)
2022/11/07(月) 14:57:30.80ID:8LbwGvMzM 明示的な型変換が可能か調べる方法ってありますか?
暗黙的ならis_convertibleが使えるのですが…
std::is_convertible<std::shared_ptr<void>, bool>::value; // trueになってほしい
暗黙的ならis_convertibleが使えるのですが…
std::is_convertible<std::shared_ptr<void>, bool>::value; // trueになってほしい
24デフォルトの名無しさん (スッップ Sdb2-oy7h)
2022/11/07(月) 16:58:07.91ID:2UaeFBkad is_constructibleを使う
25デフォルトの名無しさん (テテンテンテン MM96-REjG)
2022/11/07(月) 17:32:26.98ID:unROdsfFM26デフォルトの名無しさん (テテンテンテン MM96-REjG)
2022/11/07(月) 17:32:50.90ID:unROdsfFM >>24
ありがとうございました。
ありがとうございました。
27デフォルトの名無しさん (ササクッテロロ Sp79-uppo)
2022/11/09(水) 10:37:27.83ID:uQIa4jnTp 質問です
マネージドとかアンマネージドとかMSの呪いですか?
マネージドとかアンマネージドとかMSの呪いですか?
28デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/09(水) 11:23:16.37ID:GzNJb2MKM プログラミング言語 C++ [第四版]
BJARNE STROUSTRUP, 柴田望洋 訳
「第四章 C++を探検しよう:コンテナとアルゴリズム」のp.102-103
に以下の様なコードが有るのですが、phone_book = の右側の初期化子(?)
の部分をコンパイラ内部でどのように翻訳(解釈)していくのかの厳密な詳細が
分かりませんので、どなたか教えてもらえませんか。
struct Entry {
string name;
int number;
};
vector<Entty> phone_book = {
{"David Hyme",123456},
{"Karl Popper",234567},
{"Bertrand Arthur William Russell",2345678}
};
前提として、クラステンプレート vector<T> には、以下のような
「初期化子並びコンストラクタ」があることとします。
template <class T, class Alloc = allocator<T>>
class vector {
・・・
// 初期化子並びコンストラクタ :
vector( std::initializer_list<T> a );
・・・
}
ここで問題となるのは、以下のどちらの方法で解釈されているかということです。
[続く]
BJARNE STROUSTRUP, 柴田望洋 訳
「第四章 C++を探検しよう:コンテナとアルゴリズム」のp.102-103
に以下の様なコードが有るのですが、phone_book = の右側の初期化子(?)
の部分をコンパイラ内部でどのように翻訳(解釈)していくのかの厳密な詳細が
分かりませんので、どなたか教えてもらえませんか。
struct Entry {
string name;
int number;
};
vector<Entty> phone_book = {
{"David Hyme",123456},
{"Karl Popper",234567},
{"Bertrand Arthur William Russell",2345678}
};
前提として、クラステンプレート vector<T> には、以下のような
「初期化子並びコンストラクタ」があることとします。
template <class T, class Alloc = allocator<T>>
class vector {
・・・
// 初期化子並びコンストラクタ :
vector( std::initializer_list<T> a );
・・・
}
ここで問題となるのは、以下のどちらの方法で解釈されているかということです。
[続く]
29デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/09(水) 11:24:30.65ID:GzNJb2MKM >>28
[続き]
(1) {・・・}を翻訳した後に、コンストラクタを探す。
phone_book = の右側の部分は、コンパイラ内部で、いったん
std::initializer_list<UUU>型のオブジェクトに直される
(なお、UUU がどんな型かは不明)。
vector<Entry>クラスの中にたまたま「初期化子並びコンストラクタ」
vector( std::initializer_list<Entry> )を見つけて
initializer_list<UUU>をinitializer_list<Entry>に変換してから、
vector( std::initializer_list<Entry> )に渡す。
(2) コンストラクタを見つけた後に、{・・・}を翻訳する。
vector<Entty>クラスの中にコンストラクタを探して、
vector( std::initializer_list<Entry> ) があることを発見。
このコンストラクタの引数が、std::initializer_list<Entry>であることから、
phone_book = の右側の部分を、std::initializer_list<Entry> だと
思って、コンパイル(意味論的に解釈)する。
# 推定ですが、(1)だと上手く行かない気がします。
[続く]
[続き]
(1) {・・・}を翻訳した後に、コンストラクタを探す。
phone_book = の右側の部分は、コンパイラ内部で、いったん
std::initializer_list<UUU>型のオブジェクトに直される
(なお、UUU がどんな型かは不明)。
vector<Entry>クラスの中にたまたま「初期化子並びコンストラクタ」
vector( std::initializer_list<Entry> )を見つけて
initializer_list<UUU>をinitializer_list<Entry>に変換してから、
vector( std::initializer_list<Entry> )に渡す。
(2) コンストラクタを見つけた後に、{・・・}を翻訳する。
vector<Entty>クラスの中にコンストラクタを探して、
vector( std::initializer_list<Entry> ) があることを発見。
このコンストラクタの引数が、std::initializer_list<Entry>であることから、
phone_book = の右側の部分を、std::initializer_list<Entry> だと
思って、コンパイル(意味論的に解釈)する。
# 推定ですが、(1)だと上手く行かない気がします。
[続く]
30デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/09(水) 11:25:24.81ID:GzNJb2MKM >>29
[続き]
[自分なりに調べたこと]
[A] p.293. 11.3 「並び」によれば、
{}構文は、名前付き変数を初期化する(§6.3.5.2)だけでなく、
(すべてではないものの)多くの箇所で式として利用できる。その構文は、
以下の二種類だ:
[1] T{...}:型で修飾された形式。"T型のオブジェクトを作成してT{...}で初期化
する"ことを意味する。§11.3.2。
[2] {...}: 型で修飾されていない形式。利用している文脈に基いて型を
決定できる必要がある。§11.3.3。
# auto以外では{}内の要素の型は推論に利用「されない」」らしい。p.297
[B] p.327によると、
「{}で囲んだ並びは、以下のものに対する引数として利用できる:
[1] std::initializer_list<T>型。並びの中の要素の値は、
暗黙理にTへと変換される。
[2] 並びの中に与えられている値で初期化可能な型
[3] Tの配列への参照。並びの中の要素の値は、暗黙裡にTへと変換される。
[続き]
[自分なりに調べたこと]
[A] p.293. 11.3 「並び」によれば、
{}構文は、名前付き変数を初期化する(§6.3.5.2)だけでなく、
(すべてではないものの)多くの箇所で式として利用できる。その構文は、
以下の二種類だ:
[1] T{...}:型で修飾された形式。"T型のオブジェクトを作成してT{...}で初期化
する"ことを意味する。§11.3.2。
[2] {...}: 型で修飾されていない形式。利用している文脈に基いて型を
決定できる必要がある。§11.3.3。
# auto以外では{}内の要素の型は推論に利用「されない」」らしい。p.297
[B] p.327によると、
「{}で囲んだ並びは、以下のものに対する引数として利用できる:
[1] std::initializer_list<T>型。並びの中の要素の値は、
暗黙理にTへと変換される。
[2] 並びの中に与えられている値で初期化可能な型
[3] Tの配列への参照。並びの中の要素の値は、暗黙裡にTへと変換される。
31デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/09(水) 16:50:18.10ID:XEaxVtCg0 大体わかってそうだけど
{…}をinitializer_list<Entry>として解釈しようと試みる→中身の{"David Hyme",123456}とかをEntry型に暗黙変換しようと試みる→全部変換できれば成功
Entryがexplicit Entry(string, int);を持ってると暗黙変換できなくて失敗するようになる
{…}をinitializer_list<Entry>として解釈しようと試みる→中身の{"David Hyme",123456}とかをEntry型に暗黙変換しようと試みる→全部変換できれば成功
Entryがexplicit Entry(string, int);を持ってると暗黙変換できなくて失敗するようになる
32デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 00:59:56.86ID:8S99EFBAM >>31
vector<T>クラスのコンストラクタに、initializer_list<T> 以外の引数を
持つものが存在していた場合、どういう優先順位でコンストラクタが選ばれて
いくのでしょうか。
コンパイラは、最初に初期化子の {・・・} の部分のカンマで区切られた中身の
個数を数えてから、その個数によってどのコンストラクタを選ぶかを決めますか?
vector<T>クラスのコンストラクタに、initializer_list<T> 以外の引数を
持つものが存在していた場合、どういう優先順位でコンストラクタが選ばれて
いくのでしょうか。
コンパイラは、最初に初期化子の {・・・} の部分のカンマで区切られた中身の
個数を数えてから、その個数によってどのコンストラクタを選ぶかを決めますか?
33デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 01:07:30.02ID:8S99EFBAM >>32
仮にそうだとすると、コンパイラの内部では、
1. vector<Entty> phone_book の宣言の型である vector<Entty>を把握。
2. = の右側の初期化子の部分の{}の中の個数など大まかな特徴を掴む。
3. 2の特徴に基いて最適なvector<Entry>のコンストラクタを探す。
4. = の右側の部分を3.のコンストラクタに基いて解釈/変換する。
という少なくとも4段階の工程を得ていることになりそうですが、随分と
特殊な解釈の仕方ですね。
通常の式ならば、このように「いったりきたり」はしないものですが。
仮にそうだとすると、コンパイラの内部では、
1. vector<Entty> phone_book の宣言の型である vector<Entty>を把握。
2. = の右側の初期化子の部分の{}の中の個数など大まかな特徴を掴む。
3. 2の特徴に基いて最適なvector<Entry>のコンストラクタを探す。
4. = の右側の部分を3.のコンストラクタに基いて解釈/変換する。
という少なくとも4段階の工程を得ていることになりそうですが、随分と
特殊な解釈の仕方ですね。
通常の式ならば、このように「いったりきたり」はしないものですが。
34デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/10(木) 07:25:48.25ID:JLZuLXt50 そこは通常のオーバーロード解決と同じだけど何が気に食わないの?
f(int)とf(int,int)があってf(1,2)を解決するときに「先に引数が2個あることをチェックするなんてインチキだ!」って発狂されても
f(int)とf(int,int)があってf(1,2)を解決するときに「先に引数が2個あることをチェックするなんてインチキだ!」って発狂されても
35デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 12:27:18.30ID:Ma0XsUW1M >>34
しかし、その場合、どの関数を呼び出すかが決定されてから後に、パラメータ(実引数)
の意味解釈は変化せず、実引数の解釈は同じで、必要あらば関数の仮引数へとcastされるだけです。
ところが、今回の初期化子の場合は、実引数の大体の様子が調査された後に、
どのコンストラクタを使うかが決定。コンストラクタが決定された後に、実引数の
意味解釈まで変わります。
しかし、その場合、どの関数を呼び出すかが決定されてから後に、パラメータ(実引数)
の意味解釈は変化せず、実引数の解釈は同じで、必要あらば関数の仮引数へとcastされるだけです。
ところが、今回の初期化子の場合は、実引数の大体の様子が調査された後に、
どのコンストラクタを使うかが決定。コンストラクタが決定された後に、実引数の
意味解釈まで変わります。
36デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 12:30:32.91ID:Ma0XsUW1M >>35
[補足]
前半の通常の関数の場合、コンパイラの内部で隠れてcastされるという訳ではなく、
必要あらばちゃんとcastに必要な「変換関数」が呼び出されることまで決まって
おり、マシン語レベルで変換関数を呼び出だすcall文が生成され、その中で
変換に必要なマシン語の列が実行されます。
ところが、後半の初期化子の場合、その変換関数が呼び出されない可能性が高い
です。なぜなら、変換ではなく、最初からのコンストとラクタの仮引数の
型に合わせて意味解釈されて、いきなりその型としてコンパイルされるためです。
[補足]
前半の通常の関数の場合、コンパイラの内部で隠れてcastされるという訳ではなく、
必要あらばちゃんとcastに必要な「変換関数」が呼び出されることまで決まって
おり、マシン語レベルで変換関数を呼び出だすcall文が生成され、その中で
変換に必要なマシン語の列が実行されます。
ところが、後半の初期化子の場合、その変換関数が呼び出されない可能性が高い
です。なぜなら、変換ではなく、最初からのコンストとラクタの仮引数の
型に合わせて意味解釈されて、いきなりその型としてコンパイルされるためです。
37デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 12:33:49.93ID:Ma0XsUW1M38デフォルトの名無しさん (エムゾネ FFb2-DoDL)
2022/11/10(木) 12:36:36.70ID:43j6CzLZF これvector<Entry>に
std::array<Entry,3>とか
std::tuple<std::pair<const char*, int>, std::pair<const char*, int>, std::pair<const char*, int>>
とか受け取るコンストラクタが追加されてたらまた話変わったりするよね
一応全部合法的に受け取れるはずだから、
コンパイラはどう解決するべきかってのを >>28 は聞きたいんだと思う
std::array<Entry,3>とか
std::tuple<std::pair<const char*, int>, std::pair<const char*, int>, std::pair<const char*, int>>
とか受け取るコンストラクタが追加されてたらまた話変わったりするよね
一応全部合法的に受け取れるはずだから、
コンパイラはどう解決するべきかってのを >>28 は聞きたいんだと思う
39デフォルトの名無しさん (スッップ Sdb2-DoDL)
2022/11/10(木) 12:40:22.21ID:IDnNuz1Ud なんか書き込んでからどっちもコンパイル通らないような気がしてきた
忘れてくれ
忘れてくれ
40デフォルトの名無しさん (スプッッ Sd12-oy7h)
2022/11/10(木) 13:04:32.16ID:kKaeKygLd >>38
その場合は曖昧だって怒られるだけ
その場合は曖昧だって怒られるだけ
41デフォルトの名無しさん (スプッッ Sd12-oy7h)
2022/11/10(木) 13:24:31.23ID:WlLaCVUwd 初期化子をコンストラクタのオーバーロード候補(静的に決まる)にそれぞれ適合させてみて、どれもダメならエラー、複数当てはまるなら優先度に従って1個に絞れたらそれを選択、曖昧ならエラー
初期化子や優先度の複雑怪奇なルール詳細の事ならともかく、この大枠の話の何がそんなに原則外れで難しいと思ってるのか正直さっぱりわからない
初期化子や優先度の複雑怪奇なルール詳細の事ならともかく、この大枠の話の何がそんなに原則外れで難しいと思ってるのか正直さっぱりわからない
42デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 13:24:55.21ID:Ma0XsUW1M >>37
[補足4]
fという名前だが仮引数の型が異なる持つ関数f()が複数ある場合は、
f(a);
と書いた場合、aの部分が完全に意味解釈されて、aの型が完全に決まってから、
どのf()が呼び出されるかを選択。
選択されたf()の仮引数の型Tと実引数aの型を比較して、異なっていれば、
aの型をTに変換する変換関数を呼び出し、変換後の値を関数f()の引数として
関数f()を呼び出す。
ところが、初期化子の場合、
T v = b;
と書くと、bの型を軽く調査するが、完全には b が意味解釈される前にどの T のコンストラクタ
を呼び出すべきかの調査が始まる。その時点では、bの型は完全には決まってない。
[補足4]
fという名前だが仮引数の型が異なる持つ関数f()が複数ある場合は、
f(a);
と書いた場合、aの部分が完全に意味解釈されて、aの型が完全に決まってから、
どのf()が呼び出されるかを選択。
選択されたf()の仮引数の型Tと実引数aの型を比較して、異なっていれば、
aの型をTに変換する変換関数を呼び出し、変換後の値を関数f()の引数として
関数f()を呼び出す。
ところが、初期化子の場合、
T v = b;
と書くと、bの型を軽く調査するが、完全には b が意味解釈される前にどの T のコンストラクタ
を呼び出すべきかの調査が始まる。その時点では、bの型は完全には決まってない。
43デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 13:28:29.70ID:Ma0XsUW1M >>41
>初期化子をコンストラクタのオーバーロード候補(静的に決まる)にそれぞれ適合させてみて、どれもダメならエラー、複数当てはまるなら優先度に従って1個に絞れたらそれを選択、曖昧ならエラー
Tのどのコンストラクタを使うかが決まるまでは、初期化子の中身の型が決まりません。
なので、総当り的にチェックすることが不可能だということになります。
(原因と結果が逆なので)。
なお、Tのどのコンストラクタを使うかを決める際に、初期化子のある程度の様子は
必要になりますのでややこしくなっています。
>初期化子をコンストラクタのオーバーロード候補(静的に決まる)にそれぞれ適合させてみて、どれもダメならエラー、複数当てはまるなら優先度に従って1個に絞れたらそれを選択、曖昧ならエラー
Tのどのコンストラクタを使うかが決まるまでは、初期化子の中身の型が決まりません。
なので、総当り的にチェックすることが不可能だということになります。
(原因と結果が逆なので)。
なお、Tのどのコンストラクタを使うかを決める際に、初期化子のある程度の様子は
必要になりますのでややこしくなっています。
44デフォルトの名無しさん (アウアウウー Sacd-obsI)
2022/11/10(木) 14:13:26.85ID:99QPf7Vaa >>36
関数だって定数(もしくは定数になる式)渡したら変換関数なんか呼ばずに変換後の値を渡すようにコンパイルするだろ
関数だって定数(もしくは定数になる式)渡したら変換関数なんか呼ばずに変換後の値を渡すようにコンパイルするだろ
45デフォルトの名無しさん (スプッッ Sd12-oy7h)
2022/11/10(木) 15:49:32.45ID:kY0Aveh/d >>43
型が決まらないって何のこっちゃ
君の例だと"David Hyme"はconst char*だし123456はintだし、
{"David Hyme",123456}はEntry(に集成体初期化で暗黙変換可能)で、他の要素も全部そうだから初期化子全体はinitializer_list<Entry>(に暗黙変換可能)なのでvector(initializer_list<Entry>)が適合可能、って全部静的に決まる話だぞ(正確にはもっとややこしいけど)
どこに動的型が出てくると思った?
型が決まらないって何のこっちゃ
君の例だと"David Hyme"はconst char*だし123456はintだし、
{"David Hyme",123456}はEntry(に集成体初期化で暗黙変換可能)で、他の要素も全部そうだから初期化子全体はinitializer_list<Entry>(に暗黙変換可能)なのでvector(initializer_list<Entry>)が適合可能、って全部静的に決まる話だぞ(正確にはもっとややこしいけど)
どこに動的型が出てくると思った?
46デフォルトの名無しさん (ワッチョイ 5eb0-YZoV)
2022/11/10(木) 21:41:21.36ID:lrIHTbD+0 自分の認識と実際の動作の間に食い違いがあることを質問したのに
その認識の間違いを指摘されても認めたくない人って厄介だね。
その認識の間違いを指摘されても認めたくない人って厄介だね。
47デフォルトの名無しさん (ササクッテロロ Sp79-uppo)
2022/11/10(木) 21:44:22.55ID:xu9+brpFp プログラムは書いた通りにしか動かない
って奴だな
って奴だな
48デフォルトの名無しさん (ワッチョイ a901-Ssk3)
2022/11/10(木) 21:59:32.65ID:ycxEOHBI0 自分の認識の通りのコンパイラを作るってんならご自由にだが
そうでない以上認識を改める他なかろう
そうでない以上認識を改める他なかろう
49デフォルトの名無しさん (ワッチョイ 5ecf-o+MF)
2022/11/10(木) 22:00:55.26ID:8bOle1Do0 依存性逆転の原則または依存関係逆転の原則
50デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 22:21:23.00ID:XJxScCwYM51デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 22:22:55.08ID:XJxScCwYM 2ch/5chでレベルが高い質問をすると、バッシングを受ける傾向が有ります。
52デフォルトの名無しさん (ササクッテロロ Sp79-uppo)
2022/11/10(木) 22:23:43.35ID:xu9+brpFp 頭が良い人なら、馬鹿にも分かる説明も難なくこなすんだがなぁ
自称してるだけの馬鹿なら意味不明な話を相手の理解力のせいにするんだよなぁ
自称してるだけの馬鹿なら意味不明な話を相手の理解力のせいにするんだよなぁ
53デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 22:25:12.06ID:XJxScCwYM >>45
例えば、class定義の中身Xが同じでも、class A {X} と class B {X} では別の型です。
その意味で、型が決まってないのです。
繰り返しますが、あなたはC言語の基礎が理解出来てないか、または、IQが
この質問に対して足りてない可能性があります。
例えば、class定義の中身Xが同じでも、class A {X} と class B {X} では別の型です。
その意味で、型が決まってないのです。
繰り返しますが、あなたはC言語の基礎が理解出来てないか、または、IQが
この質問に対して足りてない可能性があります。
54デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 22:26:30.44ID:XJxScCwYM55デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 22:29:41.43ID:XJxScCwYM56デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/10(木) 22:34:40.81ID:XJxScCwYM なお、数学的な言葉に慣れてない人は私の質問が哲学的な抽象論の様に聞こえて
頭が悪い人が変なことをいっているように聞こえたかも知れません。
頭が悪い人が変なことをいっているように聞こえたかも知れません。
57デフォルトの名無しさん (ワッチョイ 5eb0-YZoV)
2022/11/10(木) 23:38:43.51ID:lrIHTbD+0 >>53
>例えば、class定義の中身Xが同じでも、class A {X} と class B {X} では別の型です。
nominal typing な世界ではたしかにAとBは別の型だが無名の{X}はAとBどちらにも一致する。
>例えば、class定義の中身Xが同じでも、class A {X} と class B {X} では別の型です。
nominal typing な世界ではたしかにAとBは別の型だが無名の{X}はAとBどちらにも一致する。
58デフォルトの名無しさん (アウアウウー Sacd-nZLu)
2022/11/10(木) 23:56:40.35ID:QHBEGLKOa >>54
最近は体調どうよ
最近は体調どうよ
59デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/11(金) 00:01:29.20ID:J8vKnsQy0 あー君が何を勘違いしてるのか分かってきた
「初期化子`{"aaa",1234}`の型」というものがあると勘違いしてるんだな
こいつは「const char*とintの要素が並んだ波括弧初期化子」であってこれ全体が型を持ってるわけじゃない
あくまで「Entryを初期化(暗黙変換)出来る初期化子」「EntryBを初期化出来る初期化子」でしかなくて、これ自体をEntryとかEntryBとかそのものだと思いこんでるのが君の根本的な間違いだ
(関数呼び出しfoo(1,2);の(1,2)だけ取り出してこの型は何だ?と聞いてるのと同じようなものでナンセンス)
初期化子の仕事はあくまで初期化なんだから、同じ文字列の初期化子でもその初期化対象の型(が許している初期化方法)によって意味は変わる
Entryのようにstringとintを持った構造体なら集成体初期化になるし、
(const char*, int)の引数を取るコンストラクタ(非explicit)の呼び出しにもなるし、
initializer_list<Foo>(Fooはconst char* とintの両方から暗黙変換できる型)にもなれる
なれるというか、初期化対象型のコンストラクタオーバーロードに対して一番適合するものを探し出す(無理ならエラーにする)のがコンパイラの仕事で、当然全部静的に決まるようになってる
こういう風に同じ波括弧にいろんな解釈方法を持たせることで初期化を柔軟に書けるようになってるわけだ(C++11で導入されたuniform initialization)
キチガイみたいだから優しく教えるのはこれで最後にする
すまんかったね
「初期化子`{"aaa",1234}`の型」というものがあると勘違いしてるんだな
こいつは「const char*とintの要素が並んだ波括弧初期化子」であってこれ全体が型を持ってるわけじゃない
あくまで「Entryを初期化(暗黙変換)出来る初期化子」「EntryBを初期化出来る初期化子」でしかなくて、これ自体をEntryとかEntryBとかそのものだと思いこんでるのが君の根本的な間違いだ
(関数呼び出しfoo(1,2);の(1,2)だけ取り出してこの型は何だ?と聞いてるのと同じようなものでナンセンス)
初期化子の仕事はあくまで初期化なんだから、同じ文字列の初期化子でもその初期化対象の型(が許している初期化方法)によって意味は変わる
Entryのようにstringとintを持った構造体なら集成体初期化になるし、
(const char*, int)の引数を取るコンストラクタ(非explicit)の呼び出しにもなるし、
initializer_list<Foo>(Fooはconst char* とintの両方から暗黙変換できる型)にもなれる
なれるというか、初期化対象型のコンストラクタオーバーロードに対して一番適合するものを探し出す(無理ならエラーにする)のがコンパイラの仕事で、当然全部静的に決まるようになってる
こういう風に同じ波括弧にいろんな解釈方法を持たせることで初期化を柔軟に書けるようになってるわけだ(C++11で導入されたuniform initialization)
キチガイみたいだから優しく教えるのはこれで最後にする
すまんかったね
60デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 00:16:31.96ID:NMTpQElqM >>59
型を持ってるわけじゃないのは当然なのに、あなたが「動的型」というこっちが
言ってないことを勝手に妄想しだしたので、基礎から解説したまでです。
こっちの方が圧倒的に頭がいいので、食い違うのです。
型を持ってるわけじゃないのは当然なのに、あなたが「動的型」というこっちが
言ってないことを勝手に妄想しだしたので、基礎から解説したまでです。
こっちの方が圧倒的に頭がいいので、食い違うのです。
61デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 00:17:28.31ID:NMTpQElqM 馬鹿は自分が馬鹿だと気付かないんです。
質問の意味すら分かってないのに質問に答えようとしてくる。
質問の意味すら分かってないのに質問に答えようとしてくる。
62デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 00:22:09.88ID:NMTpQElqM >>59
このような場合にC++では型が静的に決まるのは当たり前。
あなたこそ、動的言語を前提にしているように思える。
そういうことではなくて、コンパイラが内部でどのような順序で「静的に」翻訳作業を
行なっているかを質問している。
コンパイラ内部では型を持って無くても、構文ツリーや色々な形でデータを
持っているが、仕様では、その順序までも決まってないとコンパイラで非互換性が
出てきてしまうし、何より、C++では演算子のオーバーロードなども出来る訳
だから、コンパイラの内部的な解釈の順序まで厳密に仕様化されてなければ、
一般プログラマも混乱が生じる。
その事を聞いている。
このような場合にC++では型が静的に決まるのは当たり前。
あなたこそ、動的言語を前提にしているように思える。
そういうことではなくて、コンパイラが内部でどのような順序で「静的に」翻訳作業を
行なっているかを質問している。
コンパイラ内部では型を持って無くても、構文ツリーや色々な形でデータを
持っているが、仕様では、その順序までも決まってないとコンパイラで非互換性が
出てきてしまうし、何より、C++では演算子のオーバーロードなども出来る訳
だから、コンパイラの内部的な解釈の順序まで厳密に仕様化されてなければ、
一般プログラマも混乱が生じる。
その事を聞いている。
63デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 00:26:17.38ID:NMTpQElqM >>62
[補足]
JSなどの動的で初心者ならば、「大体」で理解していればそれで問題無い事が
多いだろうが、C++では、テンプレートもあればoperator+()演算子や型変換
演算子などをオーバーロードできるから、「大体」では駄目で、非常に細かな
コンパイルの順序や解釈の流れまでが言語の仕様書に厳密に書いてなければ
正しいアプリケーションコードを書くことが出来ないことがある。
「直感的に簡単に理解できるのに、何この馬鹿は聞いているんだ?」
などと思っているとすれば、大間違いだ。
[補足]
JSなどの動的で初心者ならば、「大体」で理解していればそれで問題無い事が
多いだろうが、C++では、テンプレートもあればoperator+()演算子や型変換
演算子などをオーバーロードできるから、「大体」では駄目で、非常に細かな
コンパイルの順序や解釈の流れまでが言語の仕様書に厳密に書いてなければ
正しいアプリケーションコードを書くことが出来ないことがある。
「直感的に簡単に理解できるのに、何この馬鹿は聞いているんだ?」
などと思っているとすれば、大間違いだ。
64デフォルトの名無しさん (ワッチョイ 5ecf-o+MF)
2022/11/11(金) 00:28:53.35ID:L/uUC/Rw0 質問はしたのだから、回答を待っていればいいだろうに
何でまた独り言を延々と書いてるのか、不思議だ
書くなら自分の日記帳に書けばいいのでは
何でまた独り言を延々と書いてるのか、不思議だ
書くなら自分の日記帳に書けばいいのでは
65デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 00:32:42.01ID:NMTpQElqM66デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 00:33:22.29ID:NMTpQElqM >>64
馬鹿な人が茶々入れしてきたので、排除する努力をしています。
馬鹿な人が茶々入れしてきたので、排除する努力をしています。
67デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 00:40:51.17ID:NMTpQElqM >>59
>Entryのようにstringとintを持った構造体なら集成体初期化になるし、
今回の例では、vector<Entry>型の初期化ですので、そんな単純ではありません。
vector<T,A>テンプレートのコンストラクタが呼び出されるはずです。
しかも、コンストラクタの種類が沢山ありますから、それを選ばなくてはなりません。
Entry a = {"xxx",1234};
ならば集成体初期化ですから、コンストラクタを選ぶ工程は無いはずですから、
比較的単純です。
ところが、今回の場合は、コンストラクタの選択から始まります。
しかし、初期化子自体の型が中途半端な状態でコンストラクタを選ぶ必要が
ありそうなので質問しているのです。
C++03で、x+y書いた場合、xとyの型が決まった後で、operator+(U,T)演算子を探します。
ところが今回の場合、初期化子の部分の型が中途半端な状態なので、コンストラクタを探す
ための手がかりが中途半端にしかないのです。
>Entryのようにstringとintを持った構造体なら集成体初期化になるし、
今回の例では、vector<Entry>型の初期化ですので、そんな単純ではありません。
vector<T,A>テンプレートのコンストラクタが呼び出されるはずです。
しかも、コンストラクタの種類が沢山ありますから、それを選ばなくてはなりません。
Entry a = {"xxx",1234};
ならば集成体初期化ですから、コンストラクタを選ぶ工程は無いはずですから、
比較的単純です。
ところが、今回の場合は、コンストラクタの選択から始まります。
しかし、初期化子自体の型が中途半端な状態でコンストラクタを選ぶ必要が
ありそうなので質問しているのです。
C++03で、x+y書いた場合、xとyの型が決まった後で、operator+(U,T)演算子を探します。
ところが今回の場合、初期化子の部分の型が中途半端な状態なので、コンストラクタを探す
ための手がかりが中途半端にしかないのです。
68デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 00:45:48.11ID:NMTpQElqM >>67
[補足]
CPerson person{"Suzuki", 25};
と書いた場合、CPersonのコンストラクタはすぐ探せます。
ところが、>>28 のように
vector<Entry> phone_book = {
{"David Hyme",123456},
{"Karl Popper",234567},
{"Bertrand Arthur William Russell",2345678}
};
の場合、テンプレート vector<T,A> の中のコンストラクタを選ぼうとしても、
初期化子の{"David Hyme",123456}には、ある意味では「型が存在してない」ので
通常のように探すことは出来ないのです。
[補足]
CPerson person{"Suzuki", 25};
と書いた場合、CPersonのコンストラクタはすぐ探せます。
ところが、>>28 のように
vector<Entry> phone_book = {
{"David Hyme",123456},
{"Karl Popper",234567},
{"Bertrand Arthur William Russell",2345678}
};
の場合、テンプレート vector<T,A> の中のコンストラクタを選ぼうとしても、
初期化子の{"David Hyme",123456}には、ある意味では「型が存在してない」ので
通常のように探すことは出来ないのです。
69デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/11(金) 00:48:44.75ID:J8vKnsQy0 >>65
正確な規則が知りたいのに規格に当たることすら思いつかないのか自称天才のボンクラ様ってのは
9.4 Initializers [dcl.init](C++20公開ドラフトN4861、正規の規格がいいなら自分で買え)を見ればいいよ
誰でも読めば分かるように書いてある規格を天才様が理解できないなんてありえないから以降質問禁止な
正確な規則が知りたいのに規格に当たることすら思いつかないのか自称天才のボンクラ様ってのは
9.4 Initializers [dcl.init](C++20公開ドラフトN4861、正規の規格がいいなら自分で買え)を見ればいいよ
誰でも読めば分かるように書いてある規格を天才様が理解できないなんてありえないから以降質問禁止な
70デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 00:55:21.61ID:NMTpQElqM >>68
[補足]
vectorは配列と似ていますが、コンパイラの内部的にはかなり違う扱いになっていて、
Entry a[3] = {
{"David Hyme",123456},
{"Karl Popper",234567},
{"Bertrand Arthur William Russell",2345678}
};
と書いたならば、コンパイルの翻訳過程は全く異なってきます。
この場合はとても単純で、
T a[N] = {XXX};
の形式は、配列初期化として特別処理されています。
なので、コンストラクタを探す工程、というものが必要ありません。
そして、{"David Hyme",123456} の型を知る必要も無く、単純に、
Entryのメンバに代入していくような処理となります。
この場合の処理は、まず最初に配列型として処理が入り、次にEntryの構造体型
としての処理が入ります。
これが理解できない人は質問には答えないで下さい。混乱の元になります。
[補足]
vectorは配列と似ていますが、コンパイラの内部的にはかなり違う扱いになっていて、
Entry a[3] = {
{"David Hyme",123456},
{"Karl Popper",234567},
{"Bertrand Arthur William Russell",2345678}
};
と書いたならば、コンパイルの翻訳過程は全く異なってきます。
この場合はとても単純で、
T a[N] = {XXX};
の形式は、配列初期化として特別処理されています。
なので、コンストラクタを探す工程、というものが必要ありません。
そして、{"David Hyme",123456} の型を知る必要も無く、単純に、
Entryのメンバに代入していくような処理となります。
この場合の処理は、まず最初に配列型として処理が入り、次にEntryの構造体型
としての処理が入ります。
これが理解できない人は質問には答えないで下さい。混乱の元になります。
71デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 00:56:13.87ID:NMTpQElqM >>69
そんな言い方されれば質問サイトの意味が無いわけです。
そんな言い方されれば質問サイトの意味が無いわけです。
72デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/11(金) 00:59:02.50ID:J8vKnsQy0 >>68
あまりにも馬鹿すぎて哀れだからもう1回だけ助け舟出してやる
いいか?vector<Entry>がどんなコンストラクタ持ってるか(どうオーバーロードされてるか)は決まってんだよ
vectorテンプレートを実体化した時点で静的に全部決まってんだよ
馬鹿なお前だって<vector>ヘッダを隅々まで読めば列挙くらい出来るのは分かるだろ
vector<Entry>のコンストラクタは例えばvector<Entry>()とかvector<Entry>(size_type)とかvector<Entry>(vector<Entry>&&)とかvector<Entry>(initilaizer_list<Entry>)とか色々あるわけだな(全部は挙げんぞ)
コンパイラ様はまずそれを列挙するわけだ。そして
・vector<Entry>()かな?→空じゃないからダメ
・vector<Entry>(size_type)かな?→{...}はsize_typeに変換できるかな?→ダメ
・vector<Entry>(vector<Entry>&&)かな?→{...}はvector<Entry>&&に変換できるかな?→ダメ
・vector<Entry>(initilaizer_list<Entry>)かな?→{...}はinitilaizer_list<Entry>に変換できるかな?→OK!
・...
ってひたすら一つずつ試すわけだ。で、vector<Entry>(initilaizer_list<Entry>)しか当てはまるものがないので、じゃあこれだとオーバーロードを解決するわけだ
コンパイラのやってることなんて基本的にこれだけだ、実に単純な話だ
こんな単純なこともわからずグチグチグチグチとお前は本当に無能だな
あまりにも馬鹿すぎて哀れだからもう1回だけ助け舟出してやる
いいか?vector<Entry>がどんなコンストラクタ持ってるか(どうオーバーロードされてるか)は決まってんだよ
vectorテンプレートを実体化した時点で静的に全部決まってんだよ
馬鹿なお前だって<vector>ヘッダを隅々まで読めば列挙くらい出来るのは分かるだろ
vector<Entry>のコンストラクタは例えばvector<Entry>()とかvector<Entry>(size_type)とかvector<Entry>(vector<Entry>&&)とかvector<Entry>(initilaizer_list<Entry>)とか色々あるわけだな(全部は挙げんぞ)
コンパイラ様はまずそれを列挙するわけだ。そして
・vector<Entry>()かな?→空じゃないからダメ
・vector<Entry>(size_type)かな?→{...}はsize_typeに変換できるかな?→ダメ
・vector<Entry>(vector<Entry>&&)かな?→{...}はvector<Entry>&&に変換できるかな?→ダメ
・vector<Entry>(initilaizer_list<Entry>)かな?→{...}はinitilaizer_list<Entry>に変換できるかな?→OK!
・...
ってひたすら一つずつ試すわけだ。で、vector<Entry>(initilaizer_list<Entry>)しか当てはまるものがないので、じゃあこれだとオーバーロードを解決するわけだ
コンパイラのやってることなんて基本的にこれだけだ、実に単純な話だ
こんな単純なこともわからずグチグチグチグチとお前は本当に無能だな
73デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 01:02:30.49ID:NMTpQElqM >>72
その探し方は、普通の関数のオーバーロード解決とは異なっていますね。
しかも、あなたの言っているほど単純じゃない。
実際は、優先順位があり、先に優先順位の低いものが見つかって、後から
優先順位が高いものが見つかっても、後の方が優先される。
あなたが馬鹿なのは、単純に考えすぎていることだ。
その探し方は、普通の関数のオーバーロード解決とは異なっていますね。
しかも、あなたの言っているほど単純じゃない。
実際は、優先順位があり、先に優先順位の低いものが見つかって、後から
優先順位が高いものが見つかっても、後の方が優先される。
あなたが馬鹿なのは、単純に考えすぎていることだ。
74デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/11(金) 01:03:31.20ID:J8vKnsQy075デフォルトの名無しさん (ワッチョイ 361f-0tFf)
2022/11/11(金) 01:04:06.86ID:hvQf6BDd076デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 01:05:05.21ID:NMTpQElqM >>73
[補足]
なお、関数のオーバーロード解決でも、「変換できるかどうか」とかそんな単純な
ものじゃないです。
例えば、T a{x} のように{}が書いてあれば、中味が1個しか書いてなくても、
initializer_list が優先される、などと決まってます。
[補足]
なお、関数のオーバーロード解決でも、「変換できるかどうか」とかそんな単純な
ものじゃないです。
例えば、T a{x} のように{}が書いてあれば、中味が1個しか書いてなくても、
initializer_list が優先される、などと決まってます。
77デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/11(金) 01:05:24.11ID:J8vKnsQy078デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 01:06:38.58ID:NMTpQElqM79デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/11(金) 01:07:31.06ID:J8vKnsQy080デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 01:07:50.72ID:NMTpQElqM81デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 01:08:28.22ID:NMTpQElqM82デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/11(金) 01:09:07.49ID:J8vKnsQy0 >>78
ここで俺や他の人が説明してあげてる内容すら理解できないなら、規格書を泣きながら読むか死んだほうが早いと思うよ
ここで俺や他の人が説明してあげてる内容すら理解できないなら、規格書を泣きながら読むか死んだほうが早いと思うよ
83デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 01:10:04.92ID:NMTpQElqM 日本は分断化が激しい社会だ。
カシコが一部に集まり、アホがあほ同士集まっている。
だから自覚できない。
そういう社会にしてしまっていることが問題。
カシコが一部に集まり、アホがあほ同士集まっている。
だから自覚できない。
そういう社会にしてしまっていることが問題。
84デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/11(金) 01:10:52.44ID:J8vKnsQy085デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 01:11:25.32ID:NMTpQElqM >>82
お前は理解できてないのに質問に答えようとしている。
いつもは質問のレベルが低いから答えられているんだろうが、今回は
お前の能力を超えている。
そしていつもの調子で質問者をレベルが低いと思い込んでいるから
馬鹿にした態度をとる。
お前は理解できてないのに質問に答えようとしている。
いつもは質問のレベルが低いから答えられているんだろうが、今回は
お前の能力を超えている。
そしていつもの調子で質問者をレベルが低いと思い込んでいるから
馬鹿にした態度をとる。
86デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 01:11:57.99ID:NMTpQElqM >>84
お前に言われたくない。
お前に言われたくない。
87デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 01:14:33.80ID:NMTpQElqM88デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/11(金) 01:16:18.16ID:J8vKnsQy0 もう終わりにするけど、俺の説明が間違ってるって言うならそれは規格と主要コンパイラの実装が間違ってるってことだから
ISOとベンダーに報告しときなよ
>>75
ごめんなさいみなさん久しぶりに面白いおもちゃだったのでつい
ISOとベンダーに報告しときなよ
>>75
ごめんなさいみなさん久しぶりに面白いおもちゃだったのでつい
89デフォルトの名無しさん (スッップ Sdb2-NivG)
2022/11/11(金) 02:19:52.16ID:tp0srwYgd キャラ剥がれてきてて草
90デフォルトの名無しさん (ワッチョイ d924-OvQ8)
2022/11/11(金) 05:29:55.03ID:wl59B58M0 std::array<T, N>って「N個の値xで埋める」コンストラクタありませんよね?
後でstd::fillするのが普通のやり方かもしれませんが、実際はstd::arrayのインスタンスができた時点でN個の何らかの初期値が入るんですよね?
この仕様に困ってます。
例えば、boost::multi_arrayは構築時にメモリの並び方 (Cライク or fortranライク) が決まって、後で変更する方法は提供されてないんですが、 std::array<boost::multiarray, N> を作ってしまうとメモリの並び方が勝手に決まってしまいます。
std::array の各要素のコンストラクタをこちらで呼ぶ方法があったら教えてください。
初期化リストで構築するやり方はNが大きいときは現実的でないので考えておりません。
後でstd::fillするのが普通のやり方かもしれませんが、実際はstd::arrayのインスタンスができた時点でN個の何らかの初期値が入るんですよね?
この仕様に困ってます。
例えば、boost::multi_arrayは構築時にメモリの並び方 (Cライク or fortranライク) が決まって、後で変更する方法は提供されてないんですが、 std::array<boost::multiarray, N> を作ってしまうとメモリの並び方が勝手に決まってしまいます。
std::array の各要素のコンストラクタをこちらで呼ぶ方法があったら教えてください。
初期化リストで構築するやり方はNが大きいときは現実的でないので考えておりません。
91デフォルトの名無しさん (US 0He2-r8ZE)
2022/11/11(金) 07:32:36.01ID:fbtAWiSRH >>54
逆はないと思いますよ
逆はないと思いますよ
92デフォルトの名無しさん (ワッチョイ f57c-q4d/)
2022/11/11(金) 07:44:40.78ID:J8vKnsQy0 >>90
残念ながらarrayで初期化時にやるのは無理
arrayは組み込み配列と同じ初期化方法(集成体初期化)しか出来ないように意図的に設計されてて特別なコンストラクタを持たない
だからarray::fill()が用意されてるので普通はそれを使う
どうしてもその場で要素のコンストラクタを直接呼びたいなら一回構築してから要素ごとにデストラクタ→placement newを呼ぶしかない
最初のデフォルト構築も許せないならarray(と組み込み配列)を使うのは諦めよう
残念ながらarrayで初期化時にやるのは無理
arrayは組み込み配列と同じ初期化方法(集成体初期化)しか出来ないように意図的に設計されてて特別なコンストラクタを持たない
だからarray::fill()が用意されてるので普通はそれを使う
どうしてもその場で要素のコンストラクタを直接呼びたいなら一回構築してから要素ごとにデストラクタ→placement newを呼ぶしかない
最初のデフォルト構築も許せないならarray(と組み込み配列)を使うのは諦めよう
93デフォルトの名無しさん (オイコラミネオ MM91-wgF3)
2022/11/11(金) 15:28:43.83ID:x9X8FiGQM94デフォルトの名無しさん (スッップ Sdb2-+knh)
2022/11/11(金) 19:19:22.94ID:+I+8FBiLd 天才ほど説明が下手だね
天賦の才に頼らず這い上がった苦労人タイプの
説明のほうが一般人には分かりやすい
天賦の才に頼らず這い上がった苦労人タイプの
説明のほうが一般人には分かりやすい
95デフォルトの名無しさん (ワッチョイ 326a-vVF3)
2022/11/11(金) 20:11:09.74ID:MfyOP1HR0 わかった気になるだけってやつね
完全に理解する必要のない一般人ならそれもあり
完全に理解する必要のない一般人ならそれもあり
96デフォルトの名無しさん (ワッチョイ 19c2-YZoV)
2022/11/11(金) 20:47:56.26ID:76yLxZ0B0 誰かを見下していなきゃ自分を保てない小さいやつ
97デフォルトの名無しさん (ブーイモ MMd5-6Mf9)
2022/11/11(金) 23:42:57.00ID:jawQM+EmM 確かに右辺値参照あたりの仕組みはコピー減らそうという意図が感じられる割に徹底しようとするとstd::arrayとかのctorで足元すくわれがち
98デフォルトの名無しさん (ワッチョイ 7501-WFXv)
2022/11/12(土) 01:01:47.32ID:0JLM8m+J0 ワッチョイつけると炎上しなくて良いね
99デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/12(土) 07:48:03.70ID:GOjTxZ8j0 arrayは組み込み配列の糞さ緩和が目的なので糞が多少まろび出るのは仕方ないんよね
100デフォルトの名無しさん (ワッチョイ 4524-6rMO)
2022/11/12(土) 09:59:28.06ID:D5o/xiXJ0101デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/12(土) 11:30:02.52ID:GOjTxZ8j0 1つでもコンストラクタを独自定義したら集成体になれないので仕方ない
102はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/12(土) 14:25:39.92ID:5guAadWy0 >>90
要素のデフォルトコンストラクタは呼ばれるので要素のほうに適当なラッパーを被せるという方法はとれなくはない。
こういうラッパーならスタンダードレイアウトの要件は満たすのでバイト列レベルでも互換性は維持されるはず。
#include <array>
#include <iostream>
struct foo {
// このコンストラクタを呼んで欲しい
foo(int x){
std::cout << x << std::endl;
}
};
template <class T, auto N>
struct initializing_wrapper : public T {
initializing_wrapper(void) : T(N) {}
};
int main() {
std::array<initializing_wrapper<foo, 1> , 3> foo;
}
要素のデフォルトコンストラクタは呼ばれるので要素のほうに適当なラッパーを被せるという方法はとれなくはない。
こういうラッパーならスタンダードレイアウトの要件は満たすのでバイト列レベルでも互換性は維持されるはず。
#include <array>
#include <iostream>
struct foo {
// このコンストラクタを呼んで欲しい
foo(int x){
std::cout << x << std::endl;
}
};
template <class T, auto N>
struct initializing_wrapper : public T {
initializing_wrapper(void) : T(N) {}
};
int main() {
std::array<initializing_wrapper<foo, 1> , 3> foo;
}
103デフォルトの名無しさん (ワッチョイ 9b7a-fwKM)
2022/11/12(土) 23:48:04.66ID:2iksiTkL0 vscodeでeigen使ったコード書いてるんだけど、デバッグ時にeigenの変数見る方法ある?
visualstudioならあるっぽいんだけど、vscode上でしょりしたいんだよね
visualstudioならあるっぽいんだけど、vscode上でしょりしたいんだよね
104デフォルトの名無しさん (ワッチョイ 4bbb-fwKM)
2022/11/13(日) 00:14:31.39ID:5VmZbZRR0 普通に変数ウォッチで見えんの?
105デフォルトの名無しさん (ワッチョイ c5c2-H0Ic)
2022/11/13(日) 04:06:31.61ID:L3LR+iGt0 ちょ、何これ? 聞いてないんだけど。。。
C:/msys64/mingw64/include/c++/12.2.0/bits/stl_pair.h:326:13: note: declared here
326 | pair& operator=(const pair&) = delete;
C:/msys64/mingw64/include/c++/12.2.0/bits/stl_pair.h:715:5: note: declared here
715 | swap(pair<_T1, _T2>&, pair<_T1, _T2>&) = delete;
C:/msys64/mingw64/include/c++/12.2.0/bits/stl_pair.h:326:13: note: declared here
326 | pair& operator=(const pair&) = delete;
C:/msys64/mingw64/include/c++/12.2.0/bits/stl_pair.h:715:5: note: declared here
715 | swap(pair<_T1, _T2>&, pair<_T1, _T2>&) = delete;
106デフォルトの名無しさん (ワッチョイ 6597-6rMO)
2022/11/13(日) 07:39:53.36ID:alAGhxI40107デフォルトの名無しさん (ワッチョイ 7501-WFXv)
2022/11/13(日) 11:52:46.36ID:7rETCoZw0 >>105
-std= で規格を指定するとか?
-std= で規格を指定するとか?
108デフォルトの名無しさん (ワッチョイ a37d-3Wva)
2022/11/13(日) 12:42:20.71ID:JmrIg+tw0 -std=c++20にしてる
109はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/13(日) 14:31:41.33ID:sejtbDAm0 >>105
本来使われるはずの定義はこっち。
https://github.com/gcc-mirror/gcc/blob/e24b430f1ea60205162fd9b327ac6a4dfc57f37c/libstdc%2B%2B-v3/include/bits/stl_pair.h#L371-L379
必要な性質 (要素の型が copy_assignable) が満たされていないときに最も優先度が低いやつが選択された上でそれが delete されているということになるんだと思う。
https://github.com/gcc-mirror/gcc/blob/e24b430f1ea60205162fd9b327ac6a4dfc57f37c/libstdc%2B%2B-v3/include/bits/stl_pair.h#L368
本来使われるはずの定義はこっち。
https://github.com/gcc-mirror/gcc/blob/e24b430f1ea60205162fd9b327ac6a4dfc57f37c/libstdc%2B%2B-v3/include/bits/stl_pair.h#L371-L379
必要な性質 (要素の型が copy_assignable) が満たされていないときに最も優先度が低いやつが選択された上でそれが delete されているということになるんだと思う。
https://github.com/gcc-mirror/gcc/blob/e24b430f1ea60205162fd9b327ac6a4dfc57f37c/libstdc%2B%2B-v3/include/bits/stl_pair.h#L368
110デフォルトの名無しさん (ワッチョイ c5c2-H0Ic)
2022/11/13(日) 16:56:29.94ID:L3LR+iGt0 壮大なSFINAEってわけか・・・
元コードは晒せないんであとは自分で探すしかないな
ヒントありがと、餃子さん
元コードは晒せないんであとは自分で探すしかないな
ヒントありがと、餃子さん
111はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/13(日) 18:18:04.90ID:sejtbDAm0 どうせ使えないなら使おうとしたときに static_assert で問題点を出すようにしたらいいのにと思ったがよく考えるとそれは駄目なんだな。
適用できるものがないということを SFINAE のトリックに使うことがあるかもしれない。
(static_assert が展開されると他の候補があっても問答無用で終わりになってしまう。)
適用できるものがないということを SFINAE のトリックに使うことがあるかもしれない。
(static_assert が展開されると他の候補があっても問答無用で終わりになってしまう。)
112デフォルトの名無しさん (ブーイモ MM69-fwKM)
2022/11/13(日) 18:23:28.51ID:BN7kyEsvM いつもサナエさんにはお世話になってる
113デフォルトの名無しさん (アウアウウー Saa9-FFna)
2022/11/14(月) 12:10:20.06ID:EWF0SvAna >>94-95
天才とパンピーで理解レベルのバックグラウンド知識に差があるからだろ
その差を埋める説明を一瞬で出来る人はそれなりの才能があるとは思うが
天才同士ならそんな説明いちいちしなくても判り合えるんだ
天才とパンピーで理解レベルのバックグラウンド知識に差があるからだろ
その差を埋める説明を一瞬で出来る人はそれなりの才能があるとは思うが
天才同士ならそんな説明いちいちしなくても判り合えるんだ
114デフォルトの名無しさん (スップ Sd03-3Wva)
2022/11/14(月) 19:05:49.95ID:KWfGC8qSd 天才はそもそも他人の説明なんかいらんからな
115デフォルトの名無しさん (US 0Ha3-XgLS)
2022/11/14(月) 22:27:38.95ID:sRgsAS70H 自分が天才だ!とわざわざ自称しなくても、天才らしい雰囲気をかもし出せるレスはないものでしょうかね…
自称天才はもういいし
自称天才はもういいし
116デフォルトの名無しさん (ワッチョイ c5c2-H0Ic)
2022/11/14(月) 22:42:37.02ID:rM2EwItV0 ギフテッドって凄すぎて訳わからんからな
117デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 12:36:06.45ID:+zOZoQ9YM プログラミング言語 C++ [第四版], 日本語訳 の p.689 に、
template<typename T>
class Xref {
・・・
};
template<typename TT, typename A>
unique_ptr<TT> make_unique(int i, A&& a)
{
return unique_ptr<TT>{new TT{i,forward<A>(a)}};
}
auto p1 = make_unique<Xref<String>>(7,"Here");
「ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
が呼び出される。」
とありますが、実引数の文字列リテラル "Here" が、make_unique()の
仮引数 A&& に渡そうとしたら、A = string と「演繹」されているようですが、
const char* 型が string に至るまでの仕組みか分かりません。
どなたが分かる人居ませんか?
実際の STL の sting は basic_string<U> テンプレートの U=charの
場合だと思われますが、意味を概念的に言えば、
class string {
public
// 変換コンストラクタ :
string(const char *) {・・・}
};
という「変換コンストラクタ」があるでしょうから、それが使われている
ことは推定は出来ます。
しかし、上記のテンプレートで T を演繹する際に、このような変換コンストラクタ
が呼び出されるメカニズムが分かりません(仕様書のどこに書いてあるのかが
分からない。)。
template<typename T>
class Xref {
・・・
};
template<typename TT, typename A>
unique_ptr<TT> make_unique(int i, A&& a)
{
return unique_ptr<TT>{new TT{i,forward<A>(a)}};
}
auto p1 = make_unique<Xref<String>>(7,"Here");
「ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
が呼び出される。」
とありますが、実引数の文字列リテラル "Here" が、make_unique()の
仮引数 A&& に渡そうとしたら、A = string と「演繹」されているようですが、
const char* 型が string に至るまでの仕組みか分かりません。
どなたが分かる人居ませんか?
実際の STL の sting は basic_string<U> テンプレートの U=charの
場合だと思われますが、意味を概念的に言えば、
class string {
public
// 変換コンストラクタ :
string(const char *) {・・・}
};
という「変換コンストラクタ」があるでしょうから、それが使われている
ことは推定は出来ます。
しかし、上記のテンプレートで T を演繹する際に、このような変換コンストラクタ
が呼び出されるメカニズムが分かりません(仕様書のどこに書いてあるのかが
分からない。)。
118デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 12:51:05.19ID:+zOZoQ9YM >>117
もっと詳しく書くと、直前から次のように書かれています:
# Xref<String>はXref<string>の写し間違いでした。
string x {"There and back again"};
template <typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept;
template <typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
ここで望まれるのは、不純なコピーを一切作ることなく、
make_unique<T>(arg)がargからTを構築することである。
その実現には左辺値と右辺値の区別を管理することが重要だ。
次の例を考えてみよう:
template<typename TT, typename A>
unique_ptr<TT> make_unique(int i, A&& a) // make_sharedのちょっとした変種
{
return unique_ptr<TT>{new TT{i,forward<A>(a)}};
}
auto p1 = make_unique<Xref<string>>(7,"Here");
ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
が呼び出される。
そして、"Here"を格納しているstringのムーブを行なうために、
Xref(int,string&&)が呼び出されることになる。
# 個人の感想: これは、A=stringと考えられます。
もっと興味深い(しかも分かりにくい)のが、次のものだ:
auto p2 = make_unique<Xref<string>>(9,x);
ここで、xが左辺値なので、左辺値を引数にforward(string&)が呼び出される。
forward()のTは、string& と導出される。そのため、返却値は string & &&となる。
もちろんそれは string & を意味する(§7.7.3)。その結果、左辺のxに対して、
Xref(int,string&)が呼び出されて、xがコピーされる。
# 個人の感想: これは、A=string&と考えられます。
もっと詳しく書くと、直前から次のように書かれています:
# Xref<String>はXref<string>の写し間違いでした。
string x {"There and back again"};
template <typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept;
template <typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
ここで望まれるのは、不純なコピーを一切作ることなく、
make_unique<T>(arg)がargからTを構築することである。
その実現には左辺値と右辺値の区別を管理することが重要だ。
次の例を考えてみよう:
template<typename TT, typename A>
unique_ptr<TT> make_unique(int i, A&& a) // make_sharedのちょっとした変種
{
return unique_ptr<TT>{new TT{i,forward<A>(a)}};
}
auto p1 = make_unique<Xref<string>>(7,"Here");
ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
が呼び出される。
そして、"Here"を格納しているstringのムーブを行なうために、
Xref(int,string&&)が呼び出されることになる。
# 個人の感想: これは、A=stringと考えられます。
もっと興味深い(しかも分かりにくい)のが、次のものだ:
auto p2 = make_unique<Xref<string>>(9,x);
ここで、xが左辺値なので、左辺値を引数にforward(string&)が呼び出される。
forward()のTは、string& と導出される。そのため、返却値は string & &&となる。
もちろんそれは string & を意味する(§7.7.3)。その結果、左辺のxに対して、
Xref(int,string&)が呼び出されて、xがコピーされる。
# 個人の感想: これは、A=string&と考えられます。
119デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 12:53:27.82ID:+zOZoQ9YM >>118
[参考]
p.724,
「文字列リテラルは、テンプレート引数には『渡せない』」
ただし、これがどう関係しているのかは不明です。
A&& a の部分に文字列リテラル"Here"を渡してはいますが。
[参考]
p.724,
「文字列リテラルは、テンプレート引数には『渡せない』」
ただし、これがどう関係しているのかは不明です。
A&& a の部分に文字列リテラル"Here"を渡してはいますが。
120デフォルトの名無しさん (アウアウウー Saa9-qc8G)
2022/11/15(火) 12:56:01.43ID:f326q+3ca ある型が来たらそれに応じた変換をするのが、何か問題なんでしょうか
121デフォルトの名無しさん (スップ Sd43-m1Df)
2022/11/15(火) 12:57:17.27ID:slZuGS0Ed make_uniqueの実体化の所でTT=Xref<String>、T=Stringって明示的に指定してるじゃん
「演繹」なんかするまでもないから規格に書いてるはずもない
天才のくせにそんな事も分からないの?
「演繹」なんかするまでもないから規格に書いてるはずもない
天才のくせにそんな事も分からないの?
122デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 13:00:23.02ID:+zOZoQ9YM123デフォルトの名無しさん (スップ Sd43-m1Df)
2022/11/15(火) 13:02:34.01ID:slZuGS0Ed 引用の範囲超えてるんで著作権侵害の疑いで削除依頼出しますね
124デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 13:03:00.86ID:+zOZoQ9YM125デフォルトの名無しさん (ワッチョイ 23a5-gPc0)
2022/11/15(火) 14:16:43.16ID:D78/LkiC0 new TT{i, forward<A>(a)}
既出だが、こう書いてあってもXrefのメンバの型がどうなるか分からんわけでしょ
先日の質問と合わせて、型パズルをスラスラ解けるような資質がない
資質がないんでXrefの『関係ない』としたところを「・・・」で埋めてる
既出だが、こう書いてあってもXrefのメンバの型がどうなるか分からんわけでしょ
先日の質問と合わせて、型パズルをスラスラ解けるような資質がない
資質がないんでXrefの『関係ない』としたところを「・・・」で埋めてる
126はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/15(火) 15:01:57.79ID:5Bng48RE0127デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 16:18:06.60ID:Q+AZCxhHM >>126
命題『A が const char (&)[5] に推論される』・・・☆
とし、背理法で考えます。
☆が正しいと仮定すると、
forward<A>(a)は、forward<const char (&)[5]>(a)となりますが、すると、
template <typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept;
template <typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
に対して、forward<const char (&)[5]>(a)
が呼び出されることになります。
しかし、
>auto p1 = make_unique<Xref<string>>(7,"Here");
>ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
>が呼び出される。
とBJ stroustrup氏が書いています。
ならば、T=const char (&)[5]の時に、
typename remove_reference<T>::type
がstringにならなければなりません。つまり、
typename remove_reference<const char (&)[5]>::type
がstringになってないと矛盾する事になります。
もし、矛盾するならば、背理法により、☆は否定されることになります。
(矛盾しそうです。)
命題『A が const char (&)[5] に推論される』・・・☆
とし、背理法で考えます。
☆が正しいと仮定すると、
forward<A>(a)は、forward<const char (&)[5]>(a)となりますが、すると、
template <typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept;
template <typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
に対して、forward<const char (&)[5]>(a)
が呼び出されることになります。
しかし、
>auto p1 = make_unique<Xref<string>>(7,"Here");
>ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
>が呼び出される。
とBJ stroustrup氏が書いています。
ならば、T=const char (&)[5]の時に、
typename remove_reference<T>::type
がstringにならなければなりません。つまり、
typename remove_reference<const char (&)[5]>::type
がstringになってないと矛盾する事になります。
もし、矛盾するならば、背理法により、☆は否定されることになります。
(矛盾しそうです。)
128デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/15(火) 16:42:50.09ID:Q+AZCxhHM129デフォルトの名無しさん (アウアウウー Saa9-qc8G)
2022/11/15(火) 16:49:22.19ID:f326q+3ca メロスはポリモーフィズムがわからない
130デフォルトの名無しさん (ワッチョイ a51f-IHKV)
2022/11/15(火) 17:18:50.72ID:eijjsxUX0 Perfumeの楽曲だろ?
131はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/15(火) 18:04:53.44ID:5Bng48RE0 >>127
> ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
> が呼び出される。
文字列リテラルは左辺値。 右辺値だと書いてあるのならそれが間違っている。
配列がポインタに (暗黙的でも明示的でも) キャストされる文脈では
そのポインタは xvalue (おおよそ右辺値のような扱いになる分類) になるが、
今回は変換が入らずに参照で受けているのでそうはならない。
/// この場合は rvalue 扱い
#include <cstdio>
void foo(const char *&x) { std::printf("lvalue"); }
void foo(const char *&&x) { std::printf("rvalue"); }
int main(void) { foo("abc"); }
/// この場合は lvalue 扱い
#include <cstdio>
template <class T> void foo(const T &x) { std::printf("lvalue"); }
template <class T> void foo(const T &&x) { std::printf("rvalue"); }
int main(void) { foo("abc"); }
> ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
> が呼び出される。
文字列リテラルは左辺値。 右辺値だと書いてあるのならそれが間違っている。
配列がポインタに (暗黙的でも明示的でも) キャストされる文脈では
そのポインタは xvalue (おおよそ右辺値のような扱いになる分類) になるが、
今回は変換が入らずに参照で受けているのでそうはならない。
/// この場合は rvalue 扱い
#include <cstdio>
void foo(const char *&x) { std::printf("lvalue"); }
void foo(const char *&&x) { std::printf("rvalue"); }
int main(void) { foo("abc"); }
/// この場合は lvalue 扱い
#include <cstdio>
template <class T> void foo(const T &x) { std::printf("lvalue"); }
template <class T> void foo(const T &&x) { std::printf("rvalue"); }
int main(void) { foo("abc"); }
132デフォルトの名無しさん (ワッチョイ d55f-cfOC)
2022/11/15(火) 18:53:35.18ID:mUSyU2rD0 文字列リテラルが左辺値ってなんで?
133デフォルトの名無しさん (ブーイモ MM39-fwKM)
2022/11/15(火) 20:56:02.85ID:aOXxipO5M 文字列リテラルは実際は配列
⇒アドレスで区別できるメモリ上のオブジェクト
⇒つまりlvalue
⇒アドレスで区別できるメモリ上のオブジェクト
⇒つまりlvalue
134デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/15(火) 20:56:58.78ID:kbPjYi7D0 文字列リテラルはメモリ上に永続的に保持されるんだから勝手に持ってっちゃダメでしょ
135デフォルトの名無しさん (ワッチョイ c5c2-H0Ic)
2022/11/15(火) 21:11:40.64ID:DJ4SZBHq0 文字列リテラルは配列型のlvalue
文字列リテラルが左辺値変形されて生じたポインタはrvalue
文字列リテラルが左辺値変形されて生じたポインタはrvalue
136はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/15(火) 23:54:26.84ID:5Bng48RE0 配列 (文字列を含む) と関数は値として扱えない、勝手にポインタに型変換するという
C から引き継いだ変則的なルールに辻褄を合わせているので全体的に変則的で
分かりにくいんだよ……。
C から引き継いだ変則的なルールに辻褄を合わせているので全体的に変則的で
分かりにくいんだよ……。
137デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:19:44.88ID:g3O9ReAZM >>131
>auto p1 = make_unique<Xref<string>>(7,"Here");
>ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
>が呼び出される。
と書かれています。
なので、"Here"がなんらかのメカニズムでstd::stringに変換されていると
解釈しました。
実験すれば白黒はっきりさせることが出来るかも知れません。
>auto p1 = make_unique<Xref<string>>(7,"Here");
>ここで、"Here"は右辺値なので、右辺値を引数にしてforward(string&&)
>が呼び出される。
と書かれています。
なので、"Here"がなんらかのメカニズムでstd::stringに変換されていると
解釈しました。
実験すれば白黒はっきりさせることが出来るかも知れません。
138デフォルトの名無しさん (ワッチョイ 23a5-iu/k)
2022/11/16(水) 00:20:20.66ID:DtzZSdSg0 マジで間違った方向に引きずり回してんのか
やっぱりすげーな
こいつは上級者だ
やっぱりすげーな
こいつは上級者だ
139デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:29:08.01ID:g3O9ReAZM >>138
C++の父であるところのBJ Stroustrup氏が直々に書いていることなのですが。
C++の父であるところのBJ Stroustrup氏が直々に書いていることなのですが。
140デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/16(水) 00:32:07.57ID:Nbbm6FAB0 禿本手元にないから確認はできないけど、「"Here"が右辺値」なんて基本的な間違い書くとは思えないんだけど
侵害くんの読み間違いか書き間違いか、本当に書いてあるなら翻訳ミスじゃないの
侵害くんの読み間違いか書き間違いか、本当に書いてあるなら翻訳ミスじゃないの
141デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/16(水) 00:32:57.76ID:Nbbm6FAB0 >>139
"Here"の配列→(配列とポインタの糞ルール)→const char*→(stringの変換コンストラクタ)→string
と変換された結果のstring一時オブジェクトが右辺値だってクドクド書いてない?ちゃんと読んだ?
"Here"の配列→(配列とポインタの糞ルール)→const char*→(stringの変換コンストラクタ)→string
と変換された結果のstring一時オブジェクトが右辺値だってクドクド書いてない?ちゃんと読んだ?
142デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:38:01.28ID:g3O9ReAZM 原書(英語版)はこうなってます:
23.5.2.1. Reference Deduction
...
template<typename T>
class Xref {
public:
Xref(int i, T* p) // store a pointer: Xref is the owner
:index{i}, elem{p}, owner{true}
{}
Xref(int i, T& r) // store a pointer to r, owned by someone else
:index{i}, elem{&r}, owner{false}
{}
Xref(int i, T&& r) // move r into Xref, Xref is the owner
:index{i}, elem{new T{move(r)}}, owner{true}
{}
~Xref()
{
if(owned) delete elem;
}
//...
private:
int index;
T* elem;
bool owned;
};
...
23.5.2.1. Reference Deduction
...
template<typename T>
class Xref {
public:
Xref(int i, T* p) // store a pointer: Xref is the owner
:index{i}, elem{p}, owner{true}
{}
Xref(int i, T& r) // store a pointer to r, owned by someone else
:index{i}, elem{&r}, owner{false}
{}
Xref(int i, T&& r) // move r into Xref, Xref is the owner
:index{i}, elem{new T{move(r)}}, owner{true}
{}
~Xref()
{
if(owned) delete elem;
}
//...
private:
int index;
T* elem;
bool owned;
};
...
143デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:38:41.12ID:g3O9ReAZM >>142
template<typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept; //§35.5.1
template<typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
template<typename TT, typename A>
unique_ptr<TT> make_unique(int i, A&& a) // simple variant of make_shared (§34.3.2)
{
return unique_ptr<TT>{new TT{i,forward<A>(a)}};
}
We want make_unique<T>(arg) to construct a T from an arg without making any spurious copies. To do that, it is essential that the lvalue/rvalue distinction is maintained. Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue, so that Xref(int,string&&) is called to move from the string holding "Here". The more interesting (subtle) case is: auto p2 = make_unique<Xref<string>>(9,x); Here, x is an lvalue, so forward(string&) is called, passing along an lvalue: forward()’s T is deduced to string& so that the return value becomes string& &&, which means string& (§7.7.3). Thus, Xref(int,string&) is called for the lvalue x, so that x is copied.
Stroustrup, Bjarne. The C++ Programming Language (p.689). Pearson Education. Kindle 版.
template<typename T>
T&& std::forward(typename remove_reference<T>::type& t) noexcept; //§35.5.1
template<typename T>
T&& std::forward(typename remove_reference<T>::type&& t) noexcept;
template<typename TT, typename A>
unique_ptr<TT> make_unique(int i, A&& a) // simple variant of make_shared (§34.3.2)
{
return unique_ptr<TT>{new TT{i,forward<A>(a)}};
}
We want make_unique<T>(arg) to construct a T from an arg without making any spurious copies. To do that, it is essential that the lvalue/rvalue distinction is maintained. Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue, so that Xref(int,string&&) is called to move from the string holding "Here". The more interesting (subtle) case is: auto p2 = make_unique<Xref<string>>(9,x); Here, x is an lvalue, so forward(string&) is called, passing along an lvalue: forward()’s T is deduced to string& so that the return value becomes string& &&, which means string& (§7.7.3). Thus, Xref(int,string&) is called for the lvalue x, so that x is copied.
Stroustrup, Bjarne. The C++ Programming Language (p.689). Pearson Education. Kindle 版.
144デフォルトの名無しさん (ワッチョイ d55f-NNfd)
2022/11/16(水) 00:40:39.32ID:85X5ndMu0 C++ど素人なんですが、この画像のようなファイル群がある時に、Visual Studioでexe化するにはどうしたら良いですか?
まず、ファイルはsln形式などになってないですが、そういったものはつくる必要はなく、ExpressionApp.cppだけ開いてビルドボタンを押したりすれば良い感じなのでしょうか?
まず、ファイルはsln形式などになってないですが、そういったものはつくる必要はなく、ExpressionApp.cppだけ開いてビルドボタンを押したりすれば良い感じなのでしょうか?
145デフォルトの名無しさん (ワッチョイ d55f-NNfd)
2022/11/16(水) 00:41:05.14ID:85X5ndMu0146デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/16(水) 00:41:14.43ID:Nbbm6FAB0 えぇ…禿さん耄碌してんなあ
147デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/16(水) 00:41:57.33ID:Nbbm6FAB0 >>145
cmake使え
cmake使え
148デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:42:22.40ID:g3O9ReAZM >>140
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue, so that Xref(int,string&&) is called to move from the string holding "Here".
>>141
テンプレート関数なので、Aという方引数が決定されるメカニズムが重要となります。
Aがstringに決定されたならば、文字列リテラルからstringへの変換法則はおなじみの
ものとなります。
それよりも、まず、どうしてAがstringに決定されたのかの「仕組み」が分かりません。
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue, so that Xref(int,string&&) is called to move from the string holding "Here".
>>141
テンプレート関数なので、Aという方引数が決定されるメカニズムが重要となります。
Aがstringに決定されたならば、文字列リテラルからstringへの変換法則はおなじみの
ものとなります。
それよりも、まず、どうしてAがstringに決定されたのかの「仕組み」が分かりません。
149デフォルトの名無しさん (アウアウウー Saa9-89mF)
2022/11/16(水) 00:44:42.87ID:P8Ivr6rPa >>144
プロジェクト作ればいいよ
プロジェクト作ればいいよ
150デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 00:50:02.83ID:g3O9ReAZM >>143
142と143の間に、次の記述が挟まっています。
So:
string x {"There and back again"};
Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"}
Xref<string> r2 {9,x}; // r2 just refers to x
Xref<string> r3 {3,new string{"There"}}; // r3 owns the string{"There"}
Here, r1 picks Xref(int,string&&) because x is an rvalue.
Similarly, r2 picks Xref(int,string&) because x is an lvalue.
Lvalues and rvalues are distinguished by template argument deduction:
an lvalue of type X is deduced as an X& and an rvalue as X.
This differs from the binding of values to non-template argument rvalue references (§12.2.1)
but is especially useful for argument forwarding (§35.5.1).
Consider writing a factory function that make Xrefs on the free store and returns
unique_ptrs to them:
142と143の間に、次の記述が挟まっています。
So:
string x {"There and back again"};
Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"}
Xref<string> r2 {9,x}; // r2 just refers to x
Xref<string> r3 {3,new string{"There"}}; // r3 owns the string{"There"}
Here, r1 picks Xref(int,string&&) because x is an rvalue.
Similarly, r2 picks Xref(int,string&) because x is an lvalue.
Lvalues and rvalues are distinguished by template argument deduction:
an lvalue of type X is deduced as an X& and an rvalue as X.
This differs from the binding of values to non-template argument rvalue references (§12.2.1)
but is especially useful for argument forwarding (§35.5.1).
Consider writing a factory function that make Xrefs on the free store and returns
unique_ptrs to them:
151デフォルトの名無しさん (ワッチョイ d55f-NNfd)
2022/11/16(水) 00:50:03.82ID:85X5ndMu0152はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/16(水) 00:51:20.49ID:eOApcCVI0 >>137
文字列リテラルが lvalue なのはややこしい解釈の余地はなく直接的に明記されている。
https://timsong-cpp.github.io/cppwp/n3337/expr.prim.general#1
少なくとも
> "Here"は右辺値なので
というのは確実に誤った記述だよ。
最初の段階で誤っているのだからそこから後の理屈の立て方に筋が通るはずがない。
>>148
A は string に決定されない。
そういう仕組みは無いのでそれを前提として考えるな。
文字列リテラルが lvalue なのはややこしい解釈の余地はなく直接的に明記されている。
https://timsong-cpp.github.io/cppwp/n3337/expr.prim.general#1
少なくとも
> "Here"は右辺値なので
というのは確実に誤った記述だよ。
最初の段階で誤っているのだからそこから後の理屈の立て方に筋が通るはずがない。
>>148
A は string に決定されない。
そういう仕組みは無いのでそれを前提として考えるな。
153デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 01:10:00.99ID:g3O9ReAZM >>152
>A は string に決定されない。
>そういう仕組みは無いのでそれを前提として考えるな。
なるほど。しかし、だとすれば、
「Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue,
so that Xref(int,string&&) is called to move from the string holding "Here".」
の部分はどう説明できますか?
>A は string に決定されない。
>そういう仕組みは無いのでそれを前提として考えるな。
なるほど。しかし、だとすれば、
「Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
"Here" is an rvalue, so forward(string&&) is called, passing along an rvalue,
so that Xref(int,string&&) is called to move from the string holding "Here".」
の部分はどう説明できますか?
154デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 01:14:18.30ID:g3O9ReAZM >>153
今思ったんですが、もしかしたら、
>Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
の部分が、
Consider: auto p1 = make_unique<Xref<string>>(7,string{"Here"});
の書き間違いだったのかもしれませんね。
なお、直接関係有りませんが、>>150の
>Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"}
>Here, r1 picks Xref(int,string&&) because x is an rvalue.
は、確認しましたが、kindle版は確かに正確にこう書かれていますが、
このr1の定義部分に「x」は存在しておらず、代わりに"Here"が存在していますので
そこも書き間違いかも知れません。
今思ったんですが、もしかしたら、
>Consider: auto p1 = make_unique<Xref<string>>(7,"Here");
の部分が、
Consider: auto p1 = make_unique<Xref<string>>(7,string{"Here"});
の書き間違いだったのかもしれませんね。
なお、直接関係有りませんが、>>150の
>Xref<string> r1 {7,"Here"}; // r1 owns a copy of string{"Here"}
>Here, r1 picks Xref(int,string&&) because x is an rvalue.
は、確認しましたが、kindle版は確かに正確にこう書かれていますが、
このr1の定義部分に「x」は存在しておらず、代わりに"Here"が存在していますので
そこも書き間違いかも知れません。
155デフォルトの名無しさん (オイコラミネオ MM71-ZKGJ)
2022/11/16(水) 01:26:05.39ID:g3O9ReAZM もしくわ、
>auto p1 = make_unique<Xref<string>>(7,"Here");
は、
auto p1 = make_unique<Xref<string>,string>(7,"Here");
と書きたかったのでしょうか。つまり、もし、
auto p1 = make_unique<Xref<string>>(7,string{"Here"});
または、
auto p1 = make_unique<Xref<string>,string>(7,"Here");
と書いてあったならば、辻褄が合いそうです。
>auto p1 = make_unique<Xref<string>>(7,"Here");
は、
auto p1 = make_unique<Xref<string>,string>(7,"Here");
と書きたかったのでしょうか。つまり、もし、
auto p1 = make_unique<Xref<string>>(7,string{"Here"});
または、
auto p1 = make_unique<Xref<string>,string>(7,"Here");
と書いてあったならば、辻褄が合いそうです。
156デフォルトの名無しさん (ワッチョイ a501-WFXv)
2022/11/16(水) 05:12:39.73ID:c3tWnPnh0 文字を反転させる関数を作っているのですがうまく行きません
voidの部分がおかしいと思うんですが正直手詰まりです
誰か解決策はありますでしょうか
実行するとrevarce関数が飛ばされて終了してしまいます
void revarse(char* p, char* r);
int main(void)
{
char str1[64];
char str2[64] = {};
printf("文字列を入力\n>>");
scanf("%s", str1);
revarse(str1, str2);
printf("%s", str2);
rewind(stdin);
getchar();
return 0;
}
//反転させる関数
void revarse(char* p, char* r)
{
int len = strlen(p);
for (int i = 0; i <= len / 2; i++)
{
*(r + i) = *(p + (len - i));
}
}
voidの部分がおかしいと思うんですが正直手詰まりです
誰か解決策はありますでしょうか
実行するとrevarce関数が飛ばされて終了してしまいます
void revarse(char* p, char* r);
int main(void)
{
char str1[64];
char str2[64] = {};
printf("文字列を入力\n>>");
scanf("%s", str1);
revarse(str1, str2);
printf("%s", str2);
rewind(stdin);
getchar();
return 0;
}
//反転させる関数
void revarse(char* p, char* r)
{
int len = strlen(p);
for (int i = 0; i <= len / 2; i++)
{
*(r + i) = *(p + (len - i));
}
}
157デフォルトの名無しさん (ワッチョイ b5da-ltfr)
2022/11/16(水) 05:28:39.68ID:PEnRRRQh0 おい、もうテメーの日記帳に書いとけや
158デフォルトの名無しさん (ワッチョイ 23ad-Y93w)
2022/11/16(水) 05:33:02.42ID:5+x4ry0S0 >>156
文字列pが "12345" だとして考えてみ?
len=5 だろ?
*(p + (len - i));
これって i=0 の時 *(p + (5 - 0)) => *(p + 5) ってことになる
ゼロベースだからインデックス5にはNULL文字'\0'が入っている
それを*r にコピーしている
つまりコピーされるのは常に長さ0の文字列
そりゃ出力したってなにも表示されないさ
あとlen / 2はおかしいだろ
練習するならマルチバイトはまず置いておいてシングルバイト文字のみ扱え
文字列pが "12345" だとして考えてみ?
len=5 だろ?
*(p + (len - i));
これって i=0 の時 *(p + (5 - 0)) => *(p + 5) ってことになる
ゼロベースだからインデックス5にはNULL文字'\0'が入っている
それを*r にコピーしている
つまりコピーされるのは常に長さ0の文字列
そりゃ出力したってなにも表示されないさ
あとlen / 2はおかしいだろ
練習するならマルチバイトはまず置いておいてシングルバイト文字のみ扱え
159デフォルトの名無しさん (ワッチョイ a501-WFXv)
2022/11/16(水) 05:50:25.16ID:c3tWnPnh0160デフォルトの名無しさん (スッップ Sd43-XKJd)
2022/11/16(水) 06:49:36.90ID:f7msq55Zd 実習問題臭いのが気になる
161デフォルトの名無しさん (ワッチョイ 6d6b-6rMO)
2022/11/16(水) 08:13:10.02ID:6xMrEJ8a0 int と N 要素の vector<double> から N+1 要素の tuple<int, double, double,...> を作る方法ってありますか
162デフォルトの名無しさん (ワッチョイ cd7c-sQ55)
2022/11/16(水) 08:25:10.43ID:Nbbm6FAB0 Nがコンパイル時に決まってないと無理
163デフォルトの名無しさん (ワッチョイ 23a5-gPc0)
2022/11/16(水) 13:34:55.97ID:DtzZSdSg0165デフォルトの名無しさん (ワッチョイ 23a5-gPc0)
2022/11/16(水) 13:43:50.52ID:DtzZSdSg0 わからん
166はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/16(水) 14:24:03.96ID:eOApcCVI0167デフォルトの名無しさん (アウアウウー Saa9-FFna)
2022/11/16(水) 17:43:24.39ID:z+sJwdsYa168はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2b3e-BvCT)
2022/11/16(水) 17:43:42.62ID:eOApcCVI0 >>148
clang に抽象構文木を見る機能があるのを思い出した。
それを通したらこんな感じ。
https://wandbox.org/permlink/NNaci7k0QcpFXc9G
表示の正確な読み取り方はワイも知らんのやが lvalue "Here" と出てるのはわかるし、
関数に渡したときに const char (&)[5] として受け取られているのはわかるやろ。
clang に抽象構文木を見る機能があるのを思い出した。
それを通したらこんな感じ。
https://wandbox.org/permlink/NNaci7k0QcpFXc9G
表示の正確な読み取り方はワイも知らんのやが lvalue "Here" と出てるのはわかるし、
関数に渡したときに const char (&)[5] として受け取られているのはわかるやろ。
169デフォルトの名無しさん (アウアウウー Saa9-FFna)
2022/11/16(水) 17:47:22.63ID:z+sJwdsYa >>161-162
Nim
Nim
170デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/19(土) 11:03:08.07ID:GrOHAxDN0 >>161
vectorの取りうるサイズがある程度決まってるのなら
予めdoubleの数が異なるtupleを用意しておくという手はある
#include <iostream>
#include <any>
#include <vector>
#include <tuple>
using namespace std;
using Vector = vector <double>;
using Int_Double_1 = tuple <int, double>;
using Int_Double_2 = tuple <int, double, double>;
any make_tuple_from_int_vector (int p0, const Vector &p1)
{
if (p1.size () == 1)
return make_tuple (p0, p1 [0]);
else if (p1.size () == 2)
return make_tuple (p0, p1 [0], p1 [1]);
else
return any ();
}
int main ()
{
Vector v1 (1, 10);
Vector v2 (2, 100);
auto v3 (any_cast <Int_Double_1> (make_tuple_from_int_vector (1000, v1)));
auto v4 (any_cast <Int_Double_2> (make_tuple_from_int_vector (10000, v2)));
return 0;
}
vectorの取りうるサイズがある程度決まってるのなら
予めdoubleの数が異なるtupleを用意しておくという手はある
#include <iostream>
#include <any>
#include <vector>
#include <tuple>
using namespace std;
using Vector = vector <double>;
using Int_Double_1 = tuple <int, double>;
using Int_Double_2 = tuple <int, double, double>;
any make_tuple_from_int_vector (int p0, const Vector &p1)
{
if (p1.size () == 1)
return make_tuple (p0, p1 [0]);
else if (p1.size () == 2)
return make_tuple (p0, p1 [0], p1 [1]);
else
return any ();
}
int main ()
{
Vector v1 (1, 10);
Vector v2 (2, 100);
auto v3 (any_cast <Int_Double_1> (make_tuple_from_int_vector (1000, v1)));
auto v4 (any_cast <Int_Double_2> (make_tuple_from_int_vector (10000, v2)));
return 0;
}
171デフォルトの名無しさん (アウアウウー Sa3b-kfYZ)
2022/11/19(土) 16:17:21.48ID:F8GIHVyHa 本当の目的を聴きたい
172デフォルトの名無しさん (ワッチョイ cf5f-pHhH)
2022/11/19(土) 19:46:58.80ID:IQ1PkgMa0 true &&false計算するのと1&&0計算するのはどっちが早いとかある?
173デフォルトの名無しさん (ワッチョイ 5701-kfYZ)
2022/11/19(土) 19:50:29.13ID:o7Lf802R0 はちみつもたまには役に立つな。
褒めてつかわす。
下がって良いぞ。
褒めてつかわす。
下がって良いぞ。
174デフォルトの名無しさん (アウアウウー Sa3b-5SHr)
2022/11/19(土) 23:24:23.61ID:G53M1f4ia >>172
trueは1なので同じです
trueは1なので同じです
175はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b63e-stRS)
2022/11/20(日) 00:27:52.78ID:RgPem6BD0 >>172
オペランドがリテラルならコンパイル時に畳み込まれるので同じ。
そうではなく型による差について問うているのなら
少なくとも現代的な処理系・実行環境だとまず差は出ないよ。
うまいこと最適化されてそんな差はどうでもよくなる。
言語仕様通りの素朴な解釈だと両オペランドを bool に型変換するという工程が入るので
int の && のほうが余計に処理をすることにはなるが……。
ちなみに C と C++ では規則が違うので詳細を調べるなら混同しないように注意。
(文言は違うけど結果的な挙動はほぼ差はないんだけど。)
オペランドがリテラルならコンパイル時に畳み込まれるので同じ。
そうではなく型による差について問うているのなら
少なくとも現代的な処理系・実行環境だとまず差は出ないよ。
うまいこと最適化されてそんな差はどうでもよくなる。
言語仕様通りの素朴な解釈だと両オペランドを bool に型変換するという工程が入るので
int の && のほうが余計に処理をすることにはなるが……。
ちなみに C と C++ では規則が違うので詳細を調べるなら混同しないように注意。
(文言は違うけど結果的な挙動はほぼ差はないんだけど。)
176デフォルトの名無しさん (オイコラミネオ MM67-yS4u)
2022/11/20(日) 13:22:48.35ID:9/YCbfcZM >>172
どちらも、最適化されれば false(偽) になって同じコードになる。
どちらも、最適化されれば false(偽) になって同じコードになる。
177デフォルトの名無しさん (オイコラミネオ MM67-yS4u)
2022/11/20(日) 13:29:22.75ID:9/YCbfcZM >>176
[補足]
最適化には高レベルから低レベルまでさまざまな層で行なわれる。
高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い
コードになる。
&& や || は、シーケンスポイントがあり A && B は A が偽ならば B を評価しないし、
A || B は、A が真なら B を評価しないので、マシン語レベルで条件 jump 命令が
生成されることが有るが、&& や || は、「高レベル」でも最適化する方法が
知られているので、このような場合、条件 jump 命令が生成されない。
また、仮に高レベルでは条件 jump 命令が生成されてしまった場合でも、
低レベルで最適化する際に、必ず真になったり必ず偽になるような条件 jump は、
無条件jumpになったり、削除されたりする。
そして、直後の命令への無条件 jump は、削除される。
二段階の無条件 jump は一段階の jump に修正される。
このような最適化を何度も何度も繰り返すので、結果的に同じことをするコードは、
同じコードになることが多い。
[補足]
最適化には高レベルから低レベルまでさまざまな層で行なわれる。
高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い
コードになる。
&& や || は、シーケンスポイントがあり A && B は A が偽ならば B を評価しないし、
A || B は、A が真なら B を評価しないので、マシン語レベルで条件 jump 命令が
生成されることが有るが、&& や || は、「高レベル」でも最適化する方法が
知られているので、このような場合、条件 jump 命令が生成されない。
また、仮に高レベルでは条件 jump 命令が生成されてしまった場合でも、
低レベルで最適化する際に、必ず真になったり必ず偽になるような条件 jump は、
無条件jumpになったり、削除されたりする。
そして、直後の命令への無条件 jump は、削除される。
二段階の無条件 jump は一段階の jump に修正される。
このような最適化を何度も何度も繰り返すので、結果的に同じことをするコードは、
同じコードになることが多い。
178デフォルトの名無しさん (オイコラミネオ MM67-yS4u)
2022/11/20(日) 13:42:45.47ID:9/YCbfcZM >>177
誤:最適化には高レベルから低レベルまでさまざまな層で行なわれる。
正:最適化は高レベルから低レベルまでさまざまな層で行なわれる。
誤:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い
正:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで修正されて短い
誤:最適化には高レベルから低レベルまでさまざまな層で行なわれる。
正:最適化は高レベルから低レベルまでさまざまな層で行なわれる。
誤:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで集成されて短い
正:高レベルで複雑な多くのマシン語が生成されても、後段の低レベルで修正されて短い
179デフォルトの名無しさん (スプッッ Sd22-FDdn)
2022/11/22(火) 08:37:00.41ID:JLBL5Nrvd windowsでstd::create_symlinkを使おうとすると
特権がいるって言われるけど、何でそんな決まりになってんの?
mklinkコマンドも特権モードじゃないとシンボリックリンク作れないし
それのどこがそんなに危険な操作なのか理解に苦しむ
特権がいるって言われるけど、何でそんな決まりになってんの?
mklinkコマンドも特権モードじゃないとシンボリックリンク作れないし
それのどこがそんなに危険な操作なのか理解に苦しむ
180デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/22(火) 09:20:47.14ID:+RKYLIKe0 権限のないディレクトリにシンボリックリンクを作ろうとしてるのでは?
181デフォルトの名無しさん (スプッッ Sd22-FDdn)
2022/11/22(火) 09:57:07.23ID:ROGUGHEjd C:じゃないHDDだし俺専用PCだし
所有権でややこしいことにはなりっこない
所有権でややこしいことにはなりっこない
182デフォルトの名無しさん (アウアウウー Sa3b-5SHr)
2022/11/22(火) 10:05:16.45ID:emKQg5jla 特権の問題じゃなくて変なもん作ろうとしとる
183デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/22(火) 10:21:25.02ID:5norvibI0 ディレクトリの権限関係なくWindows のシンボリックリンクの作成自体に管理者権限が必要、理由は知らん
ディレクトリにリンク張るならジャンクション(こっちは管理者権限不要)使えってことかも
ジャンクションの作成はコマンドからならmklink /jで行けるけどコードからやるのはちょっと面倒みたい
https://stackoverflow.com/questions/29291059/issue-creating-windows-ntfs-directory-junction-in-c-c
ディレクトリにリンク張るならジャンクション(こっちは管理者権限不要)使えってことかも
ジャンクションの作成はコマンドからならmklink /jで行けるけどコードからやるのはちょっと面倒みたい
https://stackoverflow.com/questions/29291059/issue-creating-windows-ntfs-directory-junction-in-c-c
184デフォルトの名無しさん (スッップ Sd02-TJ0J)
2022/11/22(火) 16:05:23.29ID:glPNIX2fd 一般人に使わせるとショートカットと混同して危険だからそうしてるってどっかで見た
何が危険なのかは分からなかった
何が危険なのかは分からなかった
185デフォルトの名無しさん (ワッチョイ 06cf-zHbW)
2022/11/22(火) 16:27:39.36ID:tXIkHCtk0 >ユーザー権利を持つユーザーは、誤って、または悪意を持ってシステムをシンボリック リンク攻撃に公開する可能性があります。
>シンボリック リンク攻撃は、ファイルのアクセス許可の変更、データの破損、データの破棄、または DoS 攻撃として使用できます。
というのが、Microsoft の公式見解
>シンボリック リンク攻撃は、ファイルのアクセス許可の変更、データの破損、データの破棄、または DoS 攻撃として使用できます。
というのが、Microsoft の公式見解
186デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/22(火) 16:40:48.52ID:+RKYLIKe0187デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/22(火) 16:44:11.97ID:5norvibI0188デフォルトの名無しさん (ワッチョイ 06cf-zHbW)
2022/11/22(火) 16:48:44.26ID:tXIkHCtk0 シンボリック リンクの作成 (Windows 10) - Windows security | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows/security/threat-protection/security-policy-settings/create-symbolic-links
https://learn.microsoft.com/ja-jp/windows/security/threat-protection/security-policy-settings/create-symbolic-links
189デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/22(火) 17:02:07.48ID:5norvibI0 >>188
リンク先には攻撃方法は書いてないな
シンボリックリンク攻撃 でググるとこれが出てきた
特にWindows特有というわけじゃなさそう、て言うかWindowsは/tmpみたいな誰もが共通的に使うディレクトリはないからより攻撃は難しそうだが
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c802.html
リンク先には攻撃方法は書いてないな
シンボリックリンク攻撃 でググるとこれが出てきた
特にWindows特有というわけじゃなさそう、て言うかWindowsは/tmpみたいな誰もが共通的に使うディレクトリはないからより攻撃は難しそうだが
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c802.html
190デフォルトの名無しさん (ワッチョイ cf5f-HmgA)
2022/11/22(火) 19:09:40.02ID:zDRYE0v60 他の人の書いたコードを読み解いています。
下の例では、キーが押されたら何かを切り替えてるのはわかるのですが、ここで使われている
・0xFの意味
・(1 << 0)などの右シフト?
がどういう使われ方をしてるのかが分からないので知りたいです。
16進数で掛け算して値を使っているのでしょうか?
単純な1,2,3,4などの数値で切り替えていないのも意図がよく分からないのでずが深い意味はありそうでしょうか?
// VIEW_MESH | VIEW_IMAGE | VIEW_PLOT | VIEW_LM
int _viewMode = 0xF;
enum
{
VIEW_MESH = (1 << 0),
VIEW_IMAGE = (1 << 1),
VIEW_PLOT = (1 << 2),
VIEW_LM = (1 << 3)
};
switch (key)
{
case 'i': _viewMode ^= VIEW_IMAGE; break;
case 'l': _viewMode ^= VIEW_LM; break;
case 'm': _viewMode ^= VIEW_MESH; break;
}
下の例では、キーが押されたら何かを切り替えてるのはわかるのですが、ここで使われている
・0xFの意味
・(1 << 0)などの右シフト?
がどういう使われ方をしてるのかが分からないので知りたいです。
16進数で掛け算して値を使っているのでしょうか?
単純な1,2,3,4などの数値で切り替えていないのも意図がよく分からないのでずが深い意味はありそうでしょうか?
// VIEW_MESH | VIEW_IMAGE | VIEW_PLOT | VIEW_LM
int _viewMode = 0xF;
enum
{
VIEW_MESH = (1 << 0),
VIEW_IMAGE = (1 << 1),
VIEW_PLOT = (1 << 2),
VIEW_LM = (1 << 3)
};
switch (key)
{
case 'i': _viewMode ^= VIEW_IMAGE; break;
case 'l': _viewMode ^= VIEW_LM; break;
case 'm': _viewMode ^= VIEW_MESH; break;
}
191デフォルトの名無しさん (ワッチョイ e2ad-szhu)
2022/11/22(火) 19:21:19.72ID:3Sn7h5kH0 >>190
>・0xFの意味
16進数、10進数の15、2進数の1111
> ・(1 << 0)などの右シフト?
左シフト、1 << 0に関して言えば0ビットシフトなのでつまりシフトしない、二進数で0001、10進数で1
(1 << 1)は1ビット左にシフトなので二進数で0010、10進数で2
(1 << 2)は2ビット左にシフトなので二進数で0100、10進数で4
(1 << 3)は3ビット左にシフトなので二進数で1000、10進数で8
>・0xFの意味
16進数、10進数の15、2進数の1111
> ・(1 << 0)などの右シフト?
左シフト、1 << 0に関して言えば0ビットシフトなのでつまりシフトしない、二進数で0001、10進数で1
(1 << 1)は1ビット左にシフトなので二進数で0010、10進数で2
(1 << 2)は2ビット左にシフトなので二進数で0100、10進数で4
(1 << 3)は3ビット左にシフトなので二進数で1000、10進数で8
192デフォルトの名無しさん (ワッチョイ e2ad-szhu)
2022/11/22(火) 19:40:28.84ID:3Sn7h5kH0 >>190
^= は複合代入演算子
_viewMode ^= VIEW_IMAGE は _viewMode = _viewMode ^ VIEW_IMAGE と同じ
^ は排他的論理和(ビットXOR)、二進数で 1001 ^ 1100 は 0110 になる、要はビットが同じなら偽、異なっていれば真という演算
>case 'i': _viewMode ^= VIEW_IMAGE; break;
_viewModeには1111が代入されている、VIEW_IMAGEは0010
1111 ^ 0010 は 1101 になる
その演算結果1101を_viewModeに代入する
一連のコードはビットをフラグとして扱っていて、初期値として全フラグを立たせ、keyに対して特定のフラグをへし折っている
^= は複合代入演算子
_viewMode ^= VIEW_IMAGE は _viewMode = _viewMode ^ VIEW_IMAGE と同じ
^ は排他的論理和(ビットXOR)、二進数で 1001 ^ 1100 は 0110 になる、要はビットが同じなら偽、異なっていれば真という演算
>case 'i': _viewMode ^= VIEW_IMAGE; break;
_viewModeには1111が代入されている、VIEW_IMAGEは0010
1111 ^ 0010 は 1101 になる
その演算結果1101を_viewModeに代入する
一連のコードはビットをフラグとして扱っていて、初期値として全フラグを立たせ、keyに対して特定のフラグをへし折っている
193デフォルトの名無しさん (ワッチョイ cf5f-HmgA)
2022/11/22(火) 20:24:07.39ID:zDRYE0v60194デフォルトの名無しさん (ワッチョイ 227c-stRS)
2022/11/22(火) 22:10:58.50ID:TSfOUCtJ0 論理演算とか知らない奴がプログラムやっているんだな・・・
195デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/22(火) 22:14:00.95ID:+RKYLIKe0 始めたばっかりなんでしょ
ビットをフラグとして使うとか最初は面食らったな
ビットをフラグとして使うとか最初は面食らったな
196デフォルトの名無しさん (ササクッテロリ Spdf-k7YZ)
2022/11/22(火) 22:48:40.37ID:s23xOfAqp ファミコンでもあるまいし、いまどき1ビットに意味をもたせなんて、通信制御くらいしか思い付かないなぁ
197デフォルトの名無しさん (ワッチョイ 06cf-zHbW)
2022/11/22(火) 23:01:34.34ID:tXIkHCtk0 マシン語のレベルで、演算結果を示す幾つかの1ビットデータがあって
それらにキャリーフラグ、ゼロフラグなどの名前が付いてたのが呼び方の元
それらにキャリーフラグ、ゼロフラグなどの名前が付いてたのが呼び方の元
198デフォルトの名無しさん (ササクッテロリ Spdf-k7YZ)
2022/11/22(火) 23:04:06.68ID:s23xOfAqp 恋愛ゲームのフラグと同意語だよな
199デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/22(火) 23:10:53.75ID:+RKYLIKe0 flagでしょ
大元は手旗信号
大元は手旗信号
200デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/22(火) 23:22:36.31ID:5norvibI0201デフォルトの名無しさん (ササクッテロリ Spdf-k7YZ)
2022/11/22(火) 23:49:48.37ID:s23xOfAqp >>200
そうか?普通#defineされてる名前を使うからあんま意識しないよ?
そうか?普通#defineされてる名前を使うからあんま意識しないよ?
202デフォルトの名無しさん (ワッチョイ 06cf-zHbW)
2022/11/22(火) 23:59:07.88ID:tXIkHCtk0 後方互換性や制御系の都合かもね
203デフォルトの名無しさん (ガックシ 068e-mZSb)
2022/11/23(水) 00:01:47.87ID:6zcmIvp36 >>201
defineされてようが複数のフラグをand/or で繋いだりするのは桁で管理してるからじゃん
defineされてようが複数のフラグをand/or で繋いだりするのは桁で管理してるからじゃん
204デフォルトの名無しさん (アウアウウー Sa3b-5SHr)
2022/11/23(水) 00:20:21.73ID:E00oDXjza chmodとかどうやってんの
205デフォルトの名無しさん (ワッチョイ 06cf-zHbW)
2022/11/23(水) 00:43:41.07ID:cGYFLLo00 さっきのビット演算、XOR 使うってことは
key によって特定のビットをトグルで ON/OFFする処理
の一部を抜粋した様に見える
key によって特定のビットをトグルで ON/OFFする処理
の一部を抜粋した様に見える
206デフォルトの名無しさん (ワッチョイ 77f0-yHLe)
2022/11/23(水) 05:44:17.85ID:agXFLOTv0 >>196
ご冗談を
ご冗談を
207デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/23(水) 08:43:03.58ID:g5bfG+kA0 >>201
複数フラグを同時に使う時は FlagA | FlagB とかやるんだが意識してないお前はどうやってるんだ?w
複数フラグを同時に使う時は FlagA | FlagB とかやるんだが意識してないお前はどうやってるんだ?w
208デフォルトの名無しさん (ワッチョイ e2ad-szhu)
2022/11/23(水) 09:08:55.00ID:a3Z+vFOW0209はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b63e-stRS)
2022/11/23(水) 10:34:19.99ID:TBut/iDU0 現代的な C++ なら std::byte とか std::bitset を使って欲しいところではある。
210デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/23(水) 12:32:20.17ID:A/L1k8HF0 std::byte なんてあるんだ
211デフォルトの名無しさん (アウアウウー Sa3b-kfYZ)
2022/11/23(水) 12:34:44.63ID:DxhXFxCJa istringstreamとかifstreamとかistreamとか
入力系からreadした場合実際に読めたバイト数は
.gcount()で取得出来ますが
ostringstreamとかofstreamとかostreamとか
出力系にwriteした場合実際に描き込めたバイト数はどうすれば取得出来ますか?
.pcount()とかは無いようです
入力系からreadした場合実際に読めたバイト数は
.gcount()で取得出来ますが
ostringstreamとかofstreamとかostreamとか
出力系にwriteした場合実際に描き込めたバイト数はどうすれば取得出来ますか?
.pcount()とかは無いようです
212デフォルトの名無しさん (ワッチョイ fb7c-IsEx)
2022/11/23(水) 12:40:51.08ID:fdWr7Y/z0 writeに文字数与えてるだろ?成功したらその数だよ
失敗したら未定義
失敗したら未定義
213デフォルトの名無しさん (アウアウウー Sa3b-kfYZ)
2022/11/23(水) 12:46:45.47ID:DxhXFxCJa Nを指定して成功していたら必ずNは判りますが
未定義: 失敗したとき0かどうかは判らない
定義済(0): 0からNの間の値になる可能性は無い
の未定義にあたるということですかね
途中までならその途中までの数字が知りたいと思うのは不自然?
ありがとうございます
未定義: 失敗したとき0かどうかは判らない
定義済(0): 0からNの間の値になる可能性は無い
の未定義にあたるということですかね
途中までならその途中までの数字が知りたいと思うのは不自然?
ありがとうございます
214デフォルトの名無しさん (ワッチョイ 0646-7h5B)
2022/11/23(水) 13:01:17.94ID:KaofbnpA0 write(2)じゃなくてfputs(3)に相当するから
書き込んだバイト数なんて概念はないのでは
書き込んだバイト数なんて概念はないのでは
215デフォルトの名無しさん (ワッチョイ fb7c-IsEx)
2022/11/23(水) 13:59:19.61ID:fdWr7Y/z0 書き込みエラーなんてプログラムからは何が起きてるかわかんないんだよ
最悪壊れかけのディスクにちょうどトドメ刺して何もかも吹っ飛んだのかもしれない
エラーが起きた時点でプログラム側で保証できることなんてほとんどないし、たまたま途中の何文字まで書けたかなんて大抵は無意味な情報
逆に読み込みで何文字読んだって情報は、プログラム側で管理してるメモリの話だからプログラムからも分かるし必要でもある
最悪壊れかけのディスクにちょうどトドメ刺して何もかも吹っ飛んだのかもしれない
エラーが起きた時点でプログラム側で保証できることなんてほとんどないし、たまたま途中の何文字まで書けたかなんて大抵は無意味な情報
逆に読み込みで何文字読んだって情報は、プログラム側で管理してるメモリの話だからプログラムからも分かるし必要でもある
216デフォルトの名無しさん (オッペケ Srdf-KP+k)
2022/11/23(水) 14:04:25.04ID:8VVNMMLlr テキストアライメント関係の 始端よせ/中央/終端よせ の類で
0~3の 2 bit値を ビットパターンマスクの途中に織り込んでくるのはどっきりする
0~3の 2 bit値を ビットパターンマスクの途中に織り込んでくるのはどっきりする
217デフォルトの名無しさん (ワッチョイ 4228-17Q5)
2022/11/23(水) 23:37:54.49ID:t8T/jR0m0 質問なのですがenum class初心者なのですが
enum classはint以外の整数型としても定義できるそうなので
整数型への自動変換ぐらいしてくれるのかと思いきや、
enum Foo { A, B, C, D, N };
int arr[Foo::N];
arr[Foo::A] = 1;
arr[Foo::B] = 999;
みたいに配列の添え字に使うケースで
error C2677: 二項演算子 '[': 型 'Foo' を扱うグローバルな演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
というコンパイルエラーになります……orz
Visual Studio 2019なのですがおれ環?
enum classはint以外の整数型としても定義できるそうなので
整数型への自動変換ぐらいしてくれるのかと思いきや、
enum Foo { A, B, C, D, N };
int arr[Foo::N];
arr[Foo::A] = 1;
arr[Foo::B] = 999;
みたいに配列の添え字に使うケースで
error C2677: 二項演算子 '[': 型 'Foo' を扱うグローバルな演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。
というコンパイルエラーになります……orz
Visual Studio 2019なのですがおれ環?
218デフォルトの名無しさん (スフッ Sd02-TJd5)
2022/11/23(水) 23:45:44.60ID:MlF8tgQAd enum class Fooって書いてみやがれ
219デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/23(水) 23:54:39.59ID:g5bfG+kA0220デフォルトの名無しさん (ワッチョイ 4228-17Q5)
2022/11/24(木) 00:25:30.42ID:WosJnlmu0 レス㌧クス
なるほどキャスト必須ですか、、、
Fooへの整数の代入だけエラーになるのかと思ったら
思ってたのと違う……
なるほどキャスト必須ですか、、、
Fooへの整数の代入だけエラーになるのかと思ったら
思ってたのと違う……
221デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/24(木) 01:18:48.76ID:4/0XLjMc0 スコープを限定したいときは以下のように俺は書いてるな
namespace Foo
{
enum { A, B, C, D, N };
}
int main ()
{
struct Bar
{
enum { A, B, C, D, N };
};
int arr0[Foo::N];
arr0[Foo::A] = 1;
int arr1[Bar::N];
arr1[Bar::A] = 1;
return 0;
}
namespace Foo
{
enum { A, B, C, D, N };
}
int main ()
{
struct Bar
{
enum { A, B, C, D, N };
};
int arr0[Foo::N];
arr0[Foo::A] = 1;
int arr1[Bar::N];
arr1[Bar::A] = 1;
return 0;
}
222デフォルトの名無しさん (ワッチョイ 5f01-KP+k)
2022/11/24(木) 01:41:40.71ID:4/0XLjMc0 >>221 は忘れてくれ
寝ぼけてた
寝ぼけてた
223はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b63e-stRS)
2022/11/24(木) 02:01:14.76ID:7DmT43os0 >>217
enum class といいつつ enum で宣言しているところをみるに、
ひょっとして enum と enum class が別物であることを知らずに混乱しているのでは?
ちなみに enum class も class というキーワードを使いはするが分類上はクラスではないのも混乱するかもな。
> enum classはint以外の整数型としても
たぶん underlying type のことを言っているんだと思うが
指定しなかったときの underlying type は int ではなく
その列挙体における全ての列挙子を格納可能な処理系定義のなんらかの整数としか決まってない。
(格納可能である限りは int より大きくなることはないという制約はついているけど。)
enum class といいつつ enum で宣言しているところをみるに、
ひょっとして enum と enum class が別物であることを知らずに混乱しているのでは?
ちなみに enum class も class というキーワードを使いはするが分類上はクラスではないのも混乱するかもな。
> enum classはint以外の整数型としても
たぶん underlying type のことを言っているんだと思うが
指定しなかったときの underlying type は int ではなく
その列挙体における全ての列挙子を格納可能な処理系定義のなんらかの整数としか決まってない。
(格納可能である限りは int より大きくなることはないという制約はついているけど。)
224デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/24(木) 06:18:15.26ID:0c/PVttN0 >>223
> 指定しなかったときの underlying type は int ではなく
> その列挙体における全ての列挙子を格納可能な処理系定義のなんらかの整数としか決まってない。
> (格納可能である限りは int より大きくなることはないという制約はついているけど。)
それunscoped enumeration typeの方
enum class は無指定だと int になる
https://cpprefjp.github.io/lang/cpp11/scoped_enum.html
> 指定しなかったときの underlying type は int ではなく
> その列挙体における全ての列挙子を格納可能な処理系定義のなんらかの整数としか決まってない。
> (格納可能である限りは int より大きくなることはないという制約はついているけど。)
それunscoped enumeration typeの方
enum class は無指定だと int になる
https://cpprefjp.github.io/lang/cpp11/scoped_enum.html
225デフォルトの名無しさん (ワッチョイ 4228-17Q5)
2022/11/24(木) 08:03:44.62ID:WosJnlmu0226デフォルトの名無しさん (アウアウウー Sa3b-eHBA)
2022/11/24(木) 08:35:12.79ID:0WkgaUasa >>225
おれ環ではなくて仕様
おれ環ではなくて仕様
227デフォルトの名無しさん (ワッチョイ 3bda-D5jK)
2022/11/24(木) 08:57:54.29ID:rMCXw8Tu0 C++の言語仕様を決めてる人たちの考えとしては
配列とハッシュはまったく異なる概念なので分けて使うようにってことですか?
配列とハッシュはまったく異なる概念なので分けて使うようにってことですか?
228デフォルトの名無しさん (スプッッ Sd22-FDdn)
2022/11/24(木) 09:08:45.63ID:AuoRjAvpd 逆に聞きたいが
配列とハッシュが同じカテゴリに入ることなんてあるのか?
配列とハッシュが同じカテゴリに入ることなんてあるのか?
229デフォルトの名無しさん (スフッ Sd02-XhSM)
2022/11/24(木) 09:20:49.08ID:qRYWlPaYd enumはいらないこ
230はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b63e-stRS)
2022/11/24(木) 11:00:48.22ID:7DmT43os0 歴史的経緯というやつだなぁ。
C では列挙子の型が int なんだよ。 列挙型は定義ごとに独立した型になるのに列挙子は整数そのものとして扱われる。
C++ では列挙子の型は列挙型に変更しつつも型変換がゆるゆるだから結果的に C とほぼ同じ挙動になって互換性が維持された。
あまりよくはないが C との連携は C++ の強みだから仕方がない。
でもさすがに扱いにくいから新しく enum class が作られたという経緯なので最初から使い分けを意図して二種類作られたわけではない。
enum の改良として enum class が出来たので一貫性がなく全く別物として成立している。
C では列挙子の型が int なんだよ。 列挙型は定義ごとに独立した型になるのに列挙子は整数そのものとして扱われる。
C++ では列挙子の型は列挙型に変更しつつも型変換がゆるゆるだから結果的に C とほぼ同じ挙動になって互換性が維持された。
あまりよくはないが C との連携は C++ の強みだから仕方がない。
でもさすがに扱いにくいから新しく enum class が作られたという経緯なので最初から使い分けを意図して二種類作られたわけではない。
enum の改良として enum class が出来たので一貫性がなく全く別物として成立している。
231デフォルトの名無しさん (ワッチョイ 3bda-D5jK)
2022/11/24(木) 12:09:29.22ID:rMCXw8Tu0232デフォルトの名無しさん (テテンテンテン MM8e-IwB9)
2022/11/24(木) 12:23:01.01ID:hRuvaNsTM233デフォルトの名無しさん (アウアウウー Sa3b-5SHr)
2022/11/24(木) 12:57:58.38ID:ggwtZAtna dictがいいね
234デフォルトの名無しさん (JP 0H13-W1GA)
2022/11/24(木) 14:33:18.54ID:CXfVk4LxH ハッシュを使ってマップ(対応付)ってことよね
235デフォルトの名無しさん (オイコラミネオ MM67-yS4u)
2022/11/24(木) 15:31:29.44ID:a85Uy2KJM 簡単そうに見えたけど、俺の中でなかなか理解できないのが explicit 指定。
明示的初期化、直接初期化、代入初期化(?)、暗黙の型変換の禁止、
などなど色々な概念があるし、頭の中で整理できてない。
「直接初期化」の定義が今一分かって無い。
明示的初期化、直接初期化、代入初期化(?)、暗黙の型変換の禁止、
などなど色々な概念があるし、頭の中で整理できてない。
「直接初期化」の定義が今一分かって無い。
236はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b63e-stRS)
2022/11/25(金) 09:44:10.24ID:9Oo+WeOy0 >>235
もちろん色々な概念と相互に関係はあるんだが explicit 指定に直接的に関連するルールは
・ 引数一個で呼び出せるコンストラクタ (デフォルト引数や可変長引数の場合も含む) は変換コンストラクタ (converting constructor) としても機能する
・ ただし explicit 指定がついている場合はそうならない
ってだけだな。
変換コンストラクタがいつ起動するのかはまた別の話として……。
もちろん色々な概念と相互に関係はあるんだが explicit 指定に直接的に関連するルールは
・ 引数一個で呼び出せるコンストラクタ (デフォルト引数や可変長引数の場合も含む) は変換コンストラクタ (converting constructor) としても機能する
・ ただし explicit 指定がついている場合はそうならない
ってだけだな。
変換コンストラクタがいつ起動するのかはまた別の話として……。
237デフォルトの名無しさん (スプッッ Sd22-TJ0J)
2022/11/25(金) 11:20:20.74ID:rtODN+wBd C++03まではそうだったけど
11から複数引数にも波括弧からの変換を認めない機能が追加されてややこしくなってる
struct Hoge{
/*explicit*/ Hoge(int,double,char*);
…
};
Hoge foo(){
return {42,3.14,”Hello”); // explicitだとダメ
}
Hoge h[] = { {1,1.0,””}, {2,2.0,””}}; //explicitだとダメ
11から複数引数にも波括弧からの変換を認めない機能が追加されてややこしくなってる
struct Hoge{
/*explicit*/ Hoge(int,double,char*);
…
};
Hoge foo(){
return {42,3.14,”Hello”); // explicitだとダメ
}
Hoge h[] = { {1,1.0,””}, {2,2.0,””}}; //explicitだとダメ
238デフォルトの名無しさん (アウアウウー Sa3b-kfYZ)
2022/11/25(金) 12:30:00.19ID:PV2ZG9bua ハッシュを使って実現した連想配列をハッシュって呼ぶのは
携帯電話をケータイと呼ぶような類のこと
携帯電話をケータイと呼ぶような類のこと
239デフォルトの名無しさん (テテンテンテン MM8e-IwB9)
2022/11/25(金) 12:43:43.65ID:hG6NI52YM >>238
誤用の無い範囲で用語を混同するのは理工学じゃ普通。
誤用の無い範囲で用語を混同するのは理工学じゃ普通。
240デフォルトの名無しさん (アウアウウー Sa3b-kfYZ)
2022/11/25(金) 12:47:02.94ID:PV2ZG9bua >>237
こういうこと?
#include <iostream>
using namespace std;
struct Hoge{
int a;
double b;
char *c;
explicit Hoge(int _a, double _b, char *_c) : a(_a), b(_b), c(_c) {}
};
Hoge foo(){
return Hoge{42, 3.14, "Hello"};
}
Hoge h[] = {Hoge{1, 1.0, ""}, Hoge{2, 2.0, ""}};
int main() {
return 0;
}
こういうこと?
#include <iostream>
using namespace std;
struct Hoge{
int a;
double b;
char *c;
explicit Hoge(int _a, double _b, char *_c) : a(_a), b(_b), c(_c) {}
};
Hoge foo(){
return Hoge{42, 3.14, "Hello"};
}
Hoge h[] = {Hoge{1, 1.0, ""}, Hoge{2, 2.0, ""}};
int main() {
return 0;
}
241デフォルトの名無しさん (アウアウウー Sa3b-kfYZ)
2022/11/25(金) 12:48:02.39ID:PV2ZG9bua242はちみつ餃子 ◆8X2XSCHEME (ワッチョイ b63e-stRS)
2022/11/25(金) 12:50:26.80ID:9Oo+WeOy0 そのへんの仕様を何度も読んだことは記憶にあるのに内容はなんも覚えとらん。
実際わかりにくいと思うわ。
実際わかりにくいと思うわ。
243デフォルトの名無しさん (オイコラミネオ MM67-yS4u)
2022/11/25(金) 14:21:14.78ID:TzWxad5dM 今まで本を読んでも、「直接初期化」「コピー初期化」
の厳密定義が分からなかったけど、英語版の en.cppreference.com
をそれぞれ
「direct initialization」「copy initialization」
で検索すると「全てのパターン(?)」の一覧が出てくるみたいだ。
の厳密定義が分からなかったけど、英語版の en.cppreference.com
をそれぞれ
「direct initialization」「copy initialization」
で検索すると「全てのパターン(?)」の一覧が出てくるみたいだ。
244デフォルトの名無しさん (スプッッ Sd22-TJ0J)
2022/11/25(金) 14:30:36.00ID:rtODN+wBd245デフォルトの名無しさん (スプッッ Sd22-TJ0J)
2022/11/25(金) 14:32:53.51ID:rtODN+wBd あ、第3引数const char*じゃないとダメだったすまん
246デフォルトの名無しさん (スプッッ Sd22-FDdn)
2022/11/25(金) 18:47:26.18ID:H2Sh2jTOd247デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/25(金) 20:26:20.13ID:HZEumDr50 >>246
しつこい、Perl では連想配列をハッシュと言ってるんだからいちいち数学的とが絡んでくるなよ
https://perldoc.jp/docs/perl/5.36.0/perldata.pod
しつこい、Perl では連想配列をハッシュと言ってるんだからいちいち数学的とが絡んでくるなよ
https://perldoc.jp/docs/perl/5.36.0/perldata.pod
248デフォルトの名無しさん (ササクッテロリ Spdf-k7YZ)
2022/11/25(金) 20:32:13.35ID:kbwNStuYp C++スレなんだがw
249デフォルトの名無しさん (ワッチョイ 06cf-zHbW)
2022/11/25(金) 20:51:44.30ID:v7fq4Pg10 不条理スレだろ
250デフォルトの名無しさん (アウアウウー Sa3b-5SHr)
2022/11/25(金) 20:59:11.33ID:/ARUt2jFa 一方的と連想が関係ないとかちょっと
251デフォルトの名無しさん (ワッチョイ cf5f-pHhH)
2022/11/25(金) 21:16:26.19ID:3wykxWfs0 ハッシュテーブルとかも知らなさそう
252デフォルトの名無しさん (ワッチョイ a7c2-TaOI)
2022/11/25(金) 22:15:24.17ID:mXzsiLHg0253デフォルトの名無しさん (ワッチョイ 4228-17Q5)
2022/11/25(金) 22:37:42.42ID:RzATrhyN0 explicit……
ある型を別の型にするコンストラクタを定義したのだけど
暗黙の型変換は辞めて欲しいときに使う(使った
ある型を別の型にするコンストラクタを定義したのだけど
暗黙の型変換は辞めて欲しいときに使う(使った
254デフォルトの名無しさん (ワッチョイ a7c2-TaOI)
2022/11/25(金) 22:41:33.27ID:mXzsiLHg0 C++スレでPerlマウント取りに来たの?
ダサすぎwww 本国で相手されないからってするに事欠いて、ちったあ恥を知れよ
ダサすぎwww 本国で相手されないからってするに事欠いて、ちったあ恥を知れよ
255デフォルトの名無しさん (ワッチョイ e201-IwB9)
2022/11/25(金) 22:44:15.86ID:HZEumDr50256デフォルトの名無しさん (ワッチョイ 77f0-yHLe)
2022/11/25(金) 23:04:39.42ID:UZlFL5FW0 ここはC++のスレです
257デフォルトの名無しさん (ワッチョイ 4228-17Q5)
2022/11/25(金) 23:06:31.95ID:RzATrhyN0 > >>231
> ハッシュは数学的な関数で
> 辞書とは根本的に違うぞ
之大いに我が意を得たり
ハッシュ関数使わなくても連装配列実装できるもん遅いけど
ていうかハッシュが衝突したらそこから先は線形探索か何か(通常の実装では
なので連装配列をハッシュと呼ぶ風潮は嘆かわしいPerlerの端くれだけど
> ハッシュは数学的な関数で
> 辞書とは根本的に違うぞ
之大いに我が意を得たり
ハッシュ関数使わなくても連装配列実装できるもん遅いけど
ていうかハッシュが衝突したらそこから先は線形探索か何か(通常の実装では
なので連装配列をハッシュと呼ぶ風潮は嘆かわしいPerlerの端くれだけど
258デフォルトの名無しさん (US 0H12-UafS)
2022/11/25(金) 23:19:03.90ID:AKMJjhwVH259デフォルトの名無しさん (ワッチョイ a7c2-TaOI)
2022/11/25(金) 23:59:25.23ID:mXzsiLHg0260デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/26(土) 04:52:09.51ID:rUW0f5oN0 医学用語?
ネットスラングやぞw
----
ネットスラングなので明確な定義はなく、用法は人によるところだが、おおむね下記のような人間を指すことが多い。
■コミュニケーションが苦手(コミュ障):話や文章の理解力が乏しい、円滑な意思疎通が困難、空気が読めない、相手の感情を察知できない。
■拘りが強い:些細な間違いを指摘し揚げ足を取る、自分の作ったものに手を加えられるのを嫌う(ここやwikiで言う自治厨)、理想とするパターンをもっておりそれを邪魔されるとヒステリックになる。
■短気:上記のような過ちを指摘されると反射的に逆上する。
■独善的:ロジカルシンキングが出来ず自分が悪いという思考に思い至らない。
https://dic.pixiv.net/a/%E3%82%A2%E3%82%B9%E3%83%9A
ネットスラングやぞw
----
ネットスラングなので明確な定義はなく、用法は人によるところだが、おおむね下記のような人間を指すことが多い。
■コミュニケーションが苦手(コミュ障):話や文章の理解力が乏しい、円滑な意思疎通が困難、空気が読めない、相手の感情を察知できない。
■拘りが強い:些細な間違いを指摘し揚げ足を取る、自分の作ったものに手を加えられるのを嫌う(ここやwikiで言う自治厨)、理想とするパターンをもっておりそれを邪魔されるとヒステリックになる。
■短気:上記のような過ちを指摘されると反射的に逆上する。
■独善的:ロジカルシンキングが出来ず自分が悪いという思考に思い至らない。
https://dic.pixiv.net/a/%E3%82%A2%E3%82%B9%E3%83%9A
261デフォルトの名無しさん (ワッチョイ 9701-zuBb)
2022/11/26(土) 07:25:12.45ID:iOeKRej80 医師免許持ってないやつが診察するなよ。
262デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/26(土) 07:29:45.15ID:JBLsurgz0 Perl厨はカナー症候群かw
263デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/26(土) 08:13:50.52ID:rUW0f5oN0264デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/26(土) 08:45:08.96ID:JBLsurgz0 へー、カナーと言われて傷ついてんのかw
265デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/26(土) 08:47:44.37ID:JBLsurgz0 ハッシュとはそもそも何かがわかってなくて頓珍漢なこと言って恥かいたやつは
こういう低レベルな煽り合いになると喜んでついて来やがる
こういう低レベルな煽り合いになると喜んでついて来やがる
266デフォルトの名無しさん (ワッチョイ f77c-PVVO)
2022/11/26(土) 09:09:52.76ID:Q1Vkq5Eh0 そもそもC++ではそのデータ構造のことunordered_mapって呼ぶんですよ
スレ違いやめてください
スレ違いやめてください
267デフォルトの名無しさん (アウアウウー Sa5b-YdBL)
2022/11/26(土) 09:32:30.94ID:ClD6WYXHa >>265
自己紹介は要らんよ
自己紹介は要らんよ
268デフォルトの名無しさん (アウアウウー Sa5b-zuBb)
2022/11/26(土) 10:07:14.70ID:B3T+QFuSa 最近の人はハッシュと言えば#しか思い浮かばんだろうから
perlの連想配列とか#hoge{'fuga'}とか描いてバグ理想
perlの連想配列とか#hoge{'fuga'}とか描いてバグ理想
269デフォルトの名無しさん (スッップ Sdbf-R/SA)
2022/11/26(土) 10:07:55.88ID:c2ia0w6pd 昼飯はハヤシにすっかな
270デフォルトの名無しさん (アウアウエー Sadf-/SwU)
2022/11/26(土) 10:19:15.89ID:qL7kB8pFa perl界隈で連想配列のことハッシュとか言ってる人知らないな
何十年も前からみんな連想配列連想配列言ってたでしょ
最近はハッシュって呼ぶ人もいるのかな?
むしろRubyの方なら昔から組み込みライブラリに
その名も Hash っていうそのまんまのクラスがあるから分かるけど
何十年も前からみんな連想配列連想配列言ってたでしょ
最近はハッシュって呼ぶ人もいるのかな?
むしろRubyの方なら昔から組み込みライブラリに
その名も Hash っていうそのまんまのクラスがあるから分かるけど
271デフォルトの名無しさん (ワッチョイ ffcf-RPwI)
2022/11/26(土) 10:36:56.47ID:39+gXbIT0 いちいち連想配列って言ってる人を逆に見かけたことないが。perl用語ではhashなんだし。
272デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/26(土) 10:41:58.99ID:rUW0f5oN0 >>270
まだやるの?
公式がハッシュって言ってるのになに言ってるんだよ
Perl has three built-in data types: scalars, arrays of scalars, and associative arrays of scalars, known as "hashes".
https://perldoc.perl.org/perldata#NAME
まだやるの?
公式がハッシュって言ってるのになに言ってるんだよ
Perl has three built-in data types: scalars, arrays of scalars, and associative arrays of scalars, known as "hashes".
https://perldoc.perl.org/perldata#NAME
273デフォルトの名無しさん (アウアウエー Sadf-/SwU)
2022/11/26(土) 10:48:53.00ID:qL7kB8pFa そうなん?(ヽ´ω`)
ちなみに手元のラクダ本1993年発行には
> P.37 この章の最後を締めくくる話題は連想配列である。
> 連想配列を自在に使いこなせるようにならなければPerlを究めたとは言えない。
> (略)連想配列を使えば(略)連想配列は(略)連想配列から(略)
> これが連想配列(略)連想配列も(略)連想配列全体を表すには(略)
とあるわ
ちなみに手元のラクダ本1993年発行には
> P.37 この章の最後を締めくくる話題は連想配列である。
> 連想配列を自在に使いこなせるようにならなければPerlを究めたとは言えない。
> (略)連想配列を使えば(略)連想配列は(略)連想配列から(略)
> これが連想配列(略)連想配列も(略)連想配列全体を表すには(略)
とあるわ
274デフォルトの名無しさん (アウアウウー Sa5b-zuBb)
2022/11/26(土) 10:56:49.67ID:B3T+QFuSa ラクダは連想配列だよな
何時からか知らんが#が主流になった
糞Javaの影響かも知れん
使い方で世代が判るんじゃね
知らんけど
何時からか知らんが#が主流になった
糞Javaの影響かも知れん
使い方で世代が判るんじゃね
知らんけど
275デフォルトの名無しさん (ワッチョイ f77c-PVVO)
2022/11/26(土) 10:57:15.80ID:Q1Vkq5Eh0276デフォルトの名無しさん (アウアウウー Sa5b-zuBb)
2022/11/26(土) 11:00:18.64ID:B3T+QFuSa277デフォルトの名無しさん (アウアウエー Sadf-/SwU)
2022/11/26(土) 11:07:56.03ID:qL7kB8pFa >>274
Map的なものに対する呼び方で
その人のバックグラウンドが透けて見えて少し面白いよね
map ←C++
連想配列 ←Perl
Hash ←Ruby
Map, Hashtable ←Java
Dictionary, Hashtable ←C#
Map的なものに対する呼び方で
その人のバックグラウンドが透けて見えて少し面白いよね
map ←C++
連想配列 ←Perl
Hash ←Ruby
Map, Hashtable ←Java
Dictionary, Hashtable ←C#
278デフォルトの名無しさん (ワッチョイ ffcf-RPwI)
2022/11/26(土) 11:08:03.90ID:39+gXbIT0279デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/26(土) 11:09:06.09ID:rUW0f5oN0280デフォルトの名無しさん (ワッチョイ 97f0-CQqz)
2022/11/26(土) 11:14:43.16ID:OEFvMG4I0 いつまでやんの?
このねた
このねた
281デフォルトの名無しさん (ワッチョイ f77c-PVVO)
2022/11/26(土) 11:45:12.56ID:Q1Vkq5Eh0 hash table→associative array→map→dictionaryの順に抽象度が高い呼び方なだけで、どれが合ってるとか優れてるとかいう話じゃないね
hashは略し過ぎで誤解や混同を招くバカ丸出しの呼び方だと思うけど、それで定着しちゃってるバカ言語はしょうがないから使い続ければいいと思うよ
だからバカ言語erは帰ってくれないか
hashは略し過ぎで誤解や混同を招くバカ丸出しの呼び方だと思うけど、それで定着しちゃってるバカ言語はしょうがないから使い続ければいいと思うよ
だからバカ言語erは帰ってくれないか
282デフォルトの名無しさん (アウアウウー Sa5b-zuBb)
2022/11/26(土) 11:48:39.97ID:B3T+QFuSa >>279
「ハッシュとして知られているがPerlでは連想配列と呼ぶ」なんだよ
「ハッシュとして知られているがPerlでは連想配列と呼ぶ」なんだよ
283デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/26(土) 12:04:14.67ID:rUW0f5oN0284デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/26(土) 13:22:00.66ID:H/gEJifTd285デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/26(土) 13:37:37.86ID:rUW0f5oN0 恥かいた上に粘着w
286デフォルトの名無しさん (ブーイモ MMcf-/8MR)
2022/11/27(日) 10:42:16.60ID:Kt25DdLnM std::setw は例えば整数 1 つ出力すると設定がリセットされますが std::setprecision
は持ち越されますよね
この辺の法則性というか思想みたいなものってありますか?一々調べるか試すかしかないですかね
は持ち越されますよね
この辺の法則性というか思想みたいなものってありますか?一々調べるか試すかしかないですかね
287デフォルトの名無しさん (ワッチョイ f77c-PVVO)
2022/11/27(日) 11:24:38.52ID:/D4jQIUG0 マニピュレータはストリームオブジェクトの状態を永続的に変えるのが基本的なコンセプトのはずだけど
なぜかsetwだけ例外で当初から叩かれてる
iostreamは色々と設計がいいかげんだからそういうものだと思って付き合うしかない
なぜかsetwだけ例外で当初から叩かれてる
iostreamは色々と設計がいいかげんだからそういうものだと思って付き合うしかない
288はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-Z2Iz)
2022/11/27(日) 11:45:00.03ID:VcW73S9v0 >>286
リセットというか厳密に言うと operator<< (または operator>>) のオーバーロードの内で width(0) を呼ぶことになっているものがある。
他に勝手に状態が変更されるものは書かれていないっぽいので例外的な処置だなぁ。
リセットというか厳密に言うと operator<< (または operator>>) のオーバーロードの内で width(0) を呼ぶことになっているものがある。
他に勝手に状態が変更されるものは書かれていないっぽいので例外的な処置だなぁ。
289デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/27(日) 12:51:03.79ID:cvPOxMca0 >>285
それこそを自己紹介というのだ
それこそを自己紹介というのだ
290デフォルトの名無しさん (ワッチョイ 9f01-x1ca)
2022/11/27(日) 13:53:49.92ID:Tzlpv0SL0 > 自己紹介なんかしとらんよ
> ハッシュで恥かいたのはおまえだけだ
> 技術板でねらー語だけのレスしか
> できなくなってる惨めなザマ晒してろ
でっかいブーメラン刺さってんぞw
> ハッシュで恥かいたのはおまえだけだ
> 技術板でねらー語だけのレスしか
> できなくなってる惨めなザマ晒してろ
でっかいブーメラン刺さってんぞw
291デフォルトの名無しさん (スププ Sdbf-tFPE)
2022/11/27(日) 14:00:32.19ID:Tmh9iNo1d >>272
語るに堕ちるとはまさにこの事。
おまいの主張なら、
Perl has three built-in data types: scalars, arrays of scalars, and hashes.
と書かれていなければならない。
語るに堕ちるとはまさにこの事。
おまいの主張なら、
Perl has three built-in data types: scalars, arrays of scalars, and hashes.
と書かれていなければならない。
292デフォルトの名無しさん (ワッチョイ 9f01-x1ca)
2022/11/27(日) 14:28:03.11ID:Tzlpv0SL0293デフォルトの名無しさん (アウアウウー Sa5b-zuBb)
2022/11/27(日) 14:29:32.31ID:IMKjsn3Ja 馬鹿に馬鹿って指摘すると発狂するから面白い
294デフォルトの名無しさん (ワッチョイ 971f-rzij)
2022/11/27(日) 15:28:11.27ID:fQNWVuiS0 >>292
単純にhashのほうが短くて書きやすいからじゃないの?
単純にhashのほうが短くて書きやすいからじゃないの?
295デフォルトの名無しさん (スップ Sd3f-CQqz)
2022/11/27(日) 15:53:37.14ID:/VbNuLIvd ここC++すれだぜ
296デフォルトの名無しさん (ワッチョイ 9f01-x1ca)
2022/11/27(日) 16:00:27.20ID:Tzlpv0SL0297デフォルトの名無しさん (スップ Sd3f-CQqz)
2022/11/27(日) 16:05:04.48ID:/VbNuLIvd298デフォルトの名無しさん (アウアウウー Sa5b-zuBb)
2022/11/27(日) 16:20:02.06ID:IMKjsn3Ja299デフォルトの名無しさん (スップ Sd3f-CQqz)
2022/11/27(日) 16:21:52.60ID:/VbNuLIvd いい加減他行けよ
300デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/27(日) 16:28:16.04ID:cvPOxMca0 HDDを指さしてメモリと言うやつが実在したけど
アレと同じだな
アレと同じだな
301デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/27(日) 16:31:00.38ID:cvPOxMca0302デフォルトの名無しさん (アウアウエー Sadf-/SwU)
2022/11/27(日) 16:53:39.58ID:MLqxhNeWa どうでもいいのは十分承知
スレ違いも痛感してる
comp.lang.perlへの、とあるオッサンの投稿
https://groups.google.com/g/comp.lang.perl/c/NyYms98cjAY/m/BsGQNfVSZz8J?pli=1
> Doing linear scans over an associative array is like trying to club someone
> to death with a loaded Uzi.
> Larry
associative array( ー`дー´)キリッ
はいわかってますすみませんでしたこれで終わりです
スレ違いも痛感してる
comp.lang.perlへの、とあるオッサンの投稿
https://groups.google.com/g/comp.lang.perl/c/NyYms98cjAY/m/BsGQNfVSZz8J?pli=1
> Doing linear scans over an associative array is like trying to club someone
> to death with a loaded Uzi.
> Larry
associative array( ー`дー´)キリッ
はいわかってますすみませんでしたこれで終わりです
303デフォルトの名無しさん (ワッチョイ 9f01-x1ca)
2022/11/27(日) 17:07:40.09ID:Tzlpv0SL0304デフォルトの名無しさん (ワッチョイ 9fad-RPwI)
2022/11/27(日) 22:34:21.89ID:Tgiu0YbR0 みんなunordered_map使ってる?
305デフォルトの名無しさん (ワッチョイ 9f28-9ylf)
2022/11/27(日) 23:37:16.27ID:6x5lNRGr0 >>302
どこの馬の骨かわからないおっさん……
どこの馬の骨かわからないおっさん……
306デフォルトの名無しさん (ブーイモ MMcf-/8MR)
2022/11/28(月) 01:11:46.10ID:333njSggM307デフォルトの名無しさん (ワッチョイ 9fad-RPwI)
2022/11/28(月) 05:38:40.30ID:gON1d6gf0 宇治茶を入れたら死ぬたらどうたら、意味わからん
308デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/28(月) 06:10:25.20ID:SRny5TUK0 >>303
あー、何のことかガチでわからんのね
あー、何のことかガチでわからんのね
309デフォルトの名無しさん (ワッチョイ 9f01-x1ca)
2022/11/28(月) 06:41:10.27ID:um60po1f0 言ってもない事で言いがかりつけてきて
> あー、何のことかガチでわからんのね
とか言われても...
基地害に絡まれたことしかわからんw
> あー、何のことかガチでわからんのね
とか言われても...
基地害に絡まれたことしかわからんw
310デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/28(月) 07:28:14.81ID:FI+f6bGtd とぼけられることは抜け目なくとぼけるね
見苦しさは1ミリも減らんけど
見苦しさは1ミリも減らんけど
311デフォルトの名無しさん (テテンテンテン MM8f-YdBL)
2022/11/28(月) 08:08:56.53ID:TnOYpck5M とりあえずコテ入れろよ。
NG設定するから。
NG設定するから。
312デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/28(月) 08:20:43.37ID:FI+f6bGtd 本質が解ってないから誰かの言い間違いや嘘を
完全に信じてしまいドヤ顔で他人にひけらかすやつが
配列はハッシュと強弁してるだけ
結局みんな匙投げたwww
完全に信じてしまいドヤ顔で他人にひけらかすやつが
配列はハッシュと強弁してるだけ
結局みんな匙投げたwww
313デフォルトの名無しさん (ワッチョイ 9f01-x1ca)
2022/11/28(月) 09:17:21.88ID:um60po1f0 公式ドキュメントを誰かの嘘や言い間違いとか言うアホ
なお>>278にはレスできないのでガン無視してるのが草
なお>>278にはレスできないのでガン無視してるのが草
314デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/28(月) 12:28:37.35ID:Hx2PBBJld 読んでないけど、配列は誰が何と言おうと断じてハッシュではない
315デフォルトの名無しさん (ワッチョイ ffcf-ykd8)
2022/11/28(月) 12:32:38.95ID:LDNjf6uN0 連想配列の話だったのに?
316デフォルトの名無しさん (スプッッ Sdbf-hkso)
2022/11/28(月) 12:40:00.21ID:W5LCj1xRd operator[]できりゃ配列 VS 組み込み配列以外認めない
ファイ!
ファイ!
317デフォルトの名無しさん (スップ Sdbf-CQqz)
2022/11/28(月) 13:02:13.69ID:y4obDsJqd C++のスレだからC++の配列の話に決まってる
318デフォルトの名無しさん (ワッチョイ 9f01-x1ca)
2022/11/28(月) 13:20:57.67ID:um60po1f0319デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/28(月) 18:40:08.47ID:M6XGVi6zd 配列とは有限の連続した区間の整数と
その整数に対応する数学的に導けるとは限らない値を
関連付ける辞書だ
ハッシュは任意の整数列から数学的に導かれる値だ
誰が何と言おうとどうにもならない違いがある
その整数に対応する数学的に導けるとは限らない値を
関連付ける辞書だ
ハッシュは任意の整数列から数学的に導かれる値だ
誰が何と言おうとどうにもならない違いがある
320デフォルトの名無しさん (ササクッテロロ Spcb-bAlK)
2022/11/28(月) 18:51:48.08ID:0bwybHojp 配列ってポインターの劣化版だろ?
321デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/28(月) 19:01:32.43ID:M2C6hA1cd それはC限定の狭い理解だ
本質的にはメモリそのもの
本質的にはメモリそのもの
322デフォルトの名無しさん (ワッチョイ ffcf-ykd8)
2022/11/28(月) 19:05:57.64ID:LDNjf6uN0 ポインタと言えば C言語以来だが、対象の型を宣言するし
最初からポインタ配列なんてのもあるし、そこに優劣は無い
最初からポインタ配列なんてのもあるし、そこに優劣は無い
323デフォルトの名無しさん (ワッチョイ 9f01-x1ca)
2022/11/28(月) 19:18:42.45ID:um60po1f0 >>319
誰も同じなんて言ってないぞ、頭大丈夫?w
誰も同じなんて言ってないぞ、頭大丈夫?w
324デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/28(月) 19:48:51.72ID:o1Lo2Y40d325デフォルトの名無しさん (アウアウウー Sa5b-CLnV)
2022/11/28(月) 19:58:56.64ID:XzS7ufqna ハッシュドビーフと同じ?
326デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/28(月) 20:00:17.05ID:um60po1f0327デフォルトの名無しさん (スフッ Sdbf-QDfr)
2022/11/28(月) 20:06:12.94ID:107q+t+0d WindowsライクのOS、ReactOSで見つけたハッシュの実装例:
https://github.com/reactos/reactos/pull/4916/files
見ればわかるように、ハッシュ関数は自分で作れるんだぜ。
https://github.com/reactos/reactos/pull/4916/files
見ればわかるように、ハッシュ関数は自分で作れるんだぜ。
328デフォルトの名無しさん (スフッ Sdbf-QDfr)
2022/11/28(月) 20:09:24.29ID:107q+t+0d329デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/28(月) 20:18:51.32ID:GH6cEocnd unsigned hash = 0;
for_each(container.begin(),container.end(),[&](auto x){hash += x;});
これでもハッシュには違いない
衝突耐性の制約がなければ自作なんて誰でもできる
for_each(container.begin(),container.end(),[&](auto x){hash += x;});
これでもハッシュには違いない
衝突耐性の制約がなければ自作なんて誰でもできる
330デフォルトの名無しさん (ワッチョイ f77c-PVVO)
2022/11/28(月) 20:22:10.24ID:wrNBfZfE0331デフォルトの名無しさん (ササクッテロロ Spcb-bAlK)
2022/11/28(月) 20:28:41.55ID:GDVe/V0ep 程よく刻んで一定長の値になるから
分類キーにしたりするんだろ?
分類キーにしたりするんだろ?
332デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/28(月) 20:50:49.09ID:SRny5TUK0 >>322
ポインタ配列??? おまえは何を言っているんだ?
ポインタ配列??? おまえは何を言っているんだ?
333デフォルトの名無しさん (ワッチョイ ffcf-ykd8)
2022/11/28(月) 20:53:13.19ID:LDNjf6uN0 >>332
ポインタの配列
ポインタの配列
334デフォルトの名無しさん (ササクッテロロ Spcb-bAlK)
2022/11/28(月) 20:55:34.01ID:pf+ZrZrvp 配列やポインターの指してる中身が何かは今関係ないんだがなぁw
335デフォルトの名無しさん (アウアウエー Sadf-/SwU)
2022/11/28(月) 21:53:05.48ID:iNOjxk3Aa ちなみにJavaならハッシュって言うと
java.util.Hashtableよりも
java.lang.Object#hashCode()の話に聞こえちゃうよね(;^ω^)
あとどんな型でも配列にできるんだから
ポインタの配列を「ポインタ配列」などと区別して呼ぶのは珍妙よね
>>325
ココイチのハッシュドビーフうまいよね
java.util.Hashtableよりも
java.lang.Object#hashCode()の話に聞こえちゃうよね(;^ω^)
あとどんな型でも配列にできるんだから
ポインタの配列を「ポインタ配列」などと区別して呼ぶのは珍妙よね
>>325
ココイチのハッシュドビーフうまいよね
336デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/28(月) 22:04:34.92ID:um60po1f0337デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/28(月) 22:17:15.58ID:SRny5TUK0 配列の要素が何であろうが配列は断じてハッシュではないことは微動だにしない
338デフォルトの名無しさん (ワッチョイ ffcf-ykd8)
2022/11/28(月) 22:19:20.24ID:LDNjf6uN0339デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/28(月) 22:23:15.16ID:um60po1f0340デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/28(月) 22:29:19.11ID:SRny5TUK0341はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-Z2Iz)
2022/11/28(月) 22:40:32.85ID:26iHAu1B0 ハッシュテーブルの実装に配列を使うのはごく普通のことなので「∃配列 ∈ハッシュテーブル」とは言える。
それを縮めて「配列がハッシュ」と表現する程度のことは文脈によっては自然言語的にはまあ珍しくは無い程度のもんだろ。
よくない表現だとは強く思うけどもあり得ないというほどではないんじゃないの。
それを縮めて「配列がハッシュ」と表現する程度のことは文脈によっては自然言語的にはまあ珍しくは無い程度のもんだろ。
よくない表現だとは強く思うけどもあり得ないというほどではないんじゃないの。
342デフォルトの名無しさん (アウアウエー Sadf-/SwU)
2022/11/28(月) 22:42:39.73ID:iNOjxk3Aa ( ;・`д・´)ナ、ナンダッテー!!(`・д´・(`・д´・; )
終わりかけたに見えたスレ違い展開に
ここにきてキャッシュが参戦
終わりかけたに見えたスレ違い展開に
ここにきてキャッシュが参戦
343デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/28(月) 22:51:20.41ID:SRny5TUK0 まさか餃子がこう来るとは思ってなかった
見損なった
見損なった
344はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-Z2Iz)
2022/11/28(月) 22:54:19.16ID:26iHAu1B0 繰り返すけど良くはないよ。
良くはない言い回しだけど自然言語ではその程度のブレは有るものなんだから
ある程度は前後の状況で察していくしかしょうがないだろう。
まあ今回は察した結果として最初に言い始めたやつはなんか勘違いしているっぽくはあるとは思うけど。
良くはない言い回しだけど自然言語ではその程度のブレは有るものなんだから
ある程度は前後の状況で察していくしかしょうがないだろう。
まあ今回は察した結果として最初に言い始めたやつはなんか勘違いしているっぽくはあるとは思うけど。
345デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/28(月) 22:54:20.53ID:um60po1f0 キャッシュがわざとなのかハッシュを間違えるほど取り乱してるのか判断できない...w
346デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/28(月) 22:55:21.60ID:SRny5TUK0 あ、言い間違えてた
キャッシュじゃねえハッシュだ
すまぬ >ALL
キャッシュじゃねえハッシュだ
すまぬ >ALL
347デフォルトの名無しさん (ワッチョイ 5701-L9hK)
2022/11/28(月) 23:15:54.31ID:gEsuPeHf0 USBメモリをUSB
携帯電話を携帯
携帯電話を携帯
348デフォルトの名無しさん (ワッチョイ 9701-zuBb)
2022/11/29(火) 00:38:09.61ID:michHh0F0349デフォルトの名無しさん (アウアウウー Sa5b-CLnV)
2022/11/29(火) 00:53:29.42ID:T02SHnLOa >>348
論理学苦手そう
論理学苦手そう
350デフォルトの名無しさん (ワッチョイ 9714-ar+C)
2022/11/29(火) 05:48:41.57ID:GFiCx/Of0 >>349
元レスの∃もようわからんけどな
元レスの∃もようわからんけどな
351デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/29(火) 06:08:14.94ID:4MUOq3YH0 >>348
混同してるのはお前を含めた一部の人だけ
混同してるのはお前を含めた一部の人だけ
352デフォルトの名無しさん (スッップ Sdbf-R/SA)
2022/11/29(火) 06:43:55.88ID:fXD2KOR/d >>347
一行めはメモリースティックかな
一行めはメモリースティックかな
353デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/29(火) 07:19:39.74ID:2jZTlsidd >>348
C++の、なんて限定はいらんぞ
C++の、なんて限定はいらんぞ
354デフォルトの名無しさん (ワッチョイ d769-L9hK)
2022/11/29(火) 08:22:10.19ID:KTAWdqks0 ハッシュ関数で写像した値をインデックスにとる配列
ハッシュ関数が sha1 とか長い値を返すやつだとちとしんどい
ハッシュ関数が sha1 とか長い値を返すやつだとちとしんどい
355デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/29(火) 09:30:18.45ID:H+GgH24Kd sha1はクビになった
356デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/29(火) 09:40:28.73ID:4MUOq3YH0 いわゆる要約関数と暗号学的ハッシュ関数は関連はあるけど用途が違う
どっちの関数の話かはたいてい文脈でわかるんだがたまに>>354みたいにハッシュという言葉だけに反応する奴が話をややこしくする
どっちの関数の話かはたいてい文脈でわかるんだがたまに>>354みたいにハッシュという言葉だけに反応する奴が話をややこしくする
357デフォルトの名無しさん (ワッチョイ d769-L9hK)
2022/11/29(火) 09:43:15.93ID:KTAWdqks0 どっちも衝突のリスクが低い多対1写像じゃん
358デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/29(火) 09:55:30.33ID:4MUOq3YH0 用途が違う という言葉すら理解できないのか...
359デフォルトの名無しさん (ワッチョイ d769-L9hK)
2022/11/29(火) 10:03:21.99ID:KTAWdqks0 同じだよ 単にその目的には向いてないってだけで
360デフォルトの名無しさん (アウアウウー Sa5b-CLnV)
2022/11/29(火) 10:13:02.00ID:TCD94QPfa だったら用途が違うんじゃないか?
361デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/29(火) 10:13:20.62ID:4MUOq3YH0 だから用途の違うものを持って来て「ちとしんどい」とかアホすぎるって話なんだが...
362デフォルトの名無しさん (ワッチョイ 9fad-lh66)
2022/11/29(火) 10:48:09.14ID:IBwY0siX0 用途の違いとそれを使うときのしんどさは関係ないのでは?
363デフォルトの名無しさん (アウアウウー Sa5b-yYU6)
2022/11/29(火) 17:27:05.61ID:USqQ0Gkfa 自然言語的にはそれくらいの幅があるってのには一理あるけど、
連想配列をハッシュ関数使ってなくても何でもハッシュと呼ぶのって
ゲームできる機械なら何でもファミコンって呼ぶのと同じくらいハズいよな。
連想配列をハッシュ関数使ってなくても何でもハッシュと呼ぶのって
ゲームできる機械なら何でもファミコンって呼ぶのと同じくらいハズいよな。
364デフォルトの名無しさん (ワッチョイ f77c-PVVO)
2022/11/29(火) 17:49:05.07ID:0jENVbSE0 伝わるか伝わらないかで言えばまあ伝わるから、あとは言った人間が恥かくだけの問題
だからそれでいいんだ正しいんだってダダこねれば恥の上塗りするだけ
それで何とも思わないなら別にいいんじゃないの好きに呼べば
だからそれでいいんだ正しいんだってダダこねれば恥の上塗りするだけ
それで何とも思わないなら別にいいんじゃないの好きに呼べば
365デフォルトの名無しさん (スップ Sd3f-CQqz)
2022/11/29(火) 18:22:39.82ID:Eyv4OFhKd おまいらスレタイ
366デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/29(火) 18:43:14.51ID:4MUOq3YH0367デフォルトの名無しさん (アウアウウー Sa5b-yYU6)
2022/11/29(火) 19:12:17.63ID:g0maKgnfa >>366
perlはハッシュで連想配列を実装してるんだからperl公式がperlの連想配列をハッシュと呼んでも問題ないに決まってるだろ
perlはハッシュで連想配列を実装してるんだからperl公式がperlの連想配列をハッシュと呼んでも問題ないに決まってるだろ
368デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/29(火) 19:49:15.28ID:4MUOq3YH0 誰も言ってない
> 連想配列をハッシュ関数使ってなくても何でもハッシュと呼ぶのって
とか言い出した奴にそんな事言われてもw
> 連想配列をハッシュ関数使ってなくても何でもハッシュと呼ぶのって
とか言い出した奴にそんな事言われてもw
369デフォルトの名無しさん (ブーイモ MMfb-ePCr)
2022/11/29(火) 20:17:42.05ID:BXeP2+1aM 良くこんな話を続けられるなw
370デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/29(火) 21:16:53.89ID:4UwuAQXt0371デフォルトの名無しさん (ワッチョイ 97f0-mcXv)
2022/11/29(火) 21:32:48.74ID:18+vW8PY0 誰が馬鹿なのかなんて一目瞭然なんだから落ち着いてきたところで基地外に餌やるのやめなよ…
372デフォルトの名無しさん (US 0Hab-yy58)
2022/11/29(火) 21:33:00.88ID:gIuDQpHWH 役に立つレスは >.277 のみ
Map的なものに対する呼び方で
その人のバックグラウンドが透けて見えて少し面白いよね
map ←C++
連想配列 ←Perl
Hash ←Ruby
Map, Hashtable ←Java
Dictionary, Hashtable ←C#
Map的なものに対する呼び方で
その人のバックグラウンドが透けて見えて少し面白いよね
map ←C++
連想配列 ←Perl
Hash ←Ruby
Map, Hashtable ←Java
Dictionary, Hashtable ←C#
373デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/29(火) 21:34:00.99ID:4MUOq3YH0374デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/29(火) 22:02:10.73ID:4UwuAQXt0375デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/29(火) 22:23:48.34ID:4MUOq3YH0 連想配列をハッシュと呼んでいるドキュメントがあるというだけの話なのに配列とか言い出すアホ乙
376デフォルトの名無しさん (ワッチョイ 9701-zuBb)
2022/11/29(火) 22:51:06.76ID:mBDoFEuP0 mapをhashと呼ぶのもAUTOだぞ。
377デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/29(火) 22:59:10.99ID:4UwuAQXt0 >>375
で、配列はハッシュなのか? y/[N]
で、配列はハッシュなのか? y/[N]
378デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/29(火) 23:04:55.01ID:4MUOq3YH0379デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/29(火) 23:09:48.89ID:4UwuAQXt0380デフォルトの名無しさん (ワッチョイ ffbb-NZIw)
2022/11/29(火) 23:39:35.43ID:JTTSm0Nf0 ハッシュ関数はなんて名前にしてるの?
381デフォルトの名無しさん (ワッチョイ 9fad-RPwI)
2022/11/30(水) 01:07:45.84ID:TaPBZKHt0 仮想メモリのアドレス番号それ自体がハッシュの一種であるにより、ただの配列もハッシュであると断言できる
382デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/30(水) 02:43:16.08ID:ZNMRPtWe0 >>379
これまでの話に「関係ない」質問をいきなりされてもねw
これまでの話に「関係ない」質問をいきなりされてもねw
383デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/30(水) 07:26:27.66ID:/Q74hFM3d384デフォルトの名無しさん (ワッチョイ ffcf-ykd8)
2022/11/30(水) 08:02:03.99ID:GLbLL33e0 ただの配列はアレイだろw
385デフォルトの名無しさん (アウアウウー Sa5b-FutQ)
2022/11/30(水) 08:19:43.48ID:SGXzBjU4a 配列がハッシュだってのは、a[0]とa[1]は0とか1っていうアドレスにあるわけじゃなくてaとかa+(型サイズ)のアドレスにいるってことでしょ
386デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/30(水) 08:48:42.04ID:HrCmlG76d 意味わかめ
387デフォルトの名無しさん (アウアウウー Sa5b-yYU6)
2022/11/30(水) 09:16:36.00ID:b9q4n/fOa つまりstd::vectorはハッシュだった?
388デフォルトの名無しさん (アウアウウー Sa5b-5P8G)
2022/11/30(水) 10:27:12.52ID:7ZJsRDega そんな重要な問題か?これ
389デフォルトの名無しさん (ササクッテロラ Spcb-bAlK)
2022/11/30(水) 10:30:58.80ID:3Q6Tcmrep ハッシュが切り刻んでるって意味なら配列の部分だけみたらそりゃあ切り刻んでる罠
390デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/30(水) 10:39:14.60ID:PugumI+Zd 配列がハッシュだなどとぬかす
糖質っぽいのがいて
後進に有害なので排除中なんだよ
糖質っぽいのがいて
後進に有害なので排除中なんだよ
391デフォルトの名無しさん (ササクッテロラ Spcb-bAlK)
2022/11/30(水) 10:58:53.94ID:3Q6Tcmrep まあ、別言語の用語を不用意に持ち出すのが良くないんだけどな
392デフォルトの名無しさん (アウアウウー Sa5b-zuBb)
2022/11/30(水) 11:15:38.95ID:D6E9fHT2a HAGEYO
393デフォルトの名無しさん (アウアウウー Sa5b-zuBb)
2022/11/30(水) 11:17:02.00ID:D6E9fHT2a >>363
コピーってゼロックスですか?って本があったな
コピーってゼロックスですか?って本があったな
394デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/30(水) 13:33:30.83ID:M9o3gjq4d395デフォルトの名無しさん (ワッチョイ 9701-zuBb)
2022/11/30(水) 18:59:26.64ID:YZNvxpbg0 PerlでC++にマウントですと!?
396デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/11/30(水) 19:13:15.73ID:ZrFvGDs4d あたおかの論理を分かろうとしても無駄だ
何でC++スレがタゲられたのか俺もわからん
何でC++スレがタゲられたのか俺もわからん
397デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/11/30(水) 22:13:23.44ID:ZNMRPtWe0 >>391
ただそれだけのことなのになw
ただそれだけのことなのになw
398デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/11/30(水) 22:24:11.50ID:lYG/Gr5c0 そこに逃げるしかねえもんな
399デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/12/01(木) 05:58:18.98ID:jAeBwf3w0 そりゃPerlでの連想配列の呼び方の話に
> で、配列はハッシュなのか? y/[N]
なんて言ってもない事で絡まれたら逃げるわなw
> で、配列はハッシュなのか? y/[N]
なんて言ってもない事で絡まれたら逃げるわなw
400デフォルトの名無しさん (スッップ Sdbf-R/SA)
2022/12/01(木) 06:39:11.77ID:GVUgh1ntd スレチの話題を持ち込んで散々引張っといて
このヌケサクはなに言ってんだ
このヌケサクはなに言ってんだ
401デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/12/01(木) 06:52:39.37ID:jAeBwf3w0 そう言うのは糖質でとんちんかんな
> で、配列はハッシュなのか? y/[N]
みたいなこと言うやつに言ってくれよw
> で、配列はハッシュなのか? y/[N]
みたいなこと言うやつに言ってくれよw
402デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/12/01(木) 07:10:43.57ID:K5eb9zSvd 嫌われ者
403デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/12/01(木) 08:04:02.01ID:jAeBwf3w0 そういうこと言い出すのは反論できない白旗にしか見えないよw
404デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/12/01(木) 09:53:27.47ID:KyNjFts3d 配列がハッシュかどうか答えに窮してんのおまえじゃんw
はい/いいえのどちらでもバカにされんの確定してて
はい/いいえのどちらでもバカにされんの確定してて
405デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/12/01(木) 09:55:51.97ID:KyNjFts3d 自分の身の丈より高い評価を貰おうと思うな
バカにされるようなこと言ったんだから
まず当たり前の結果を受け入れろ
バカにされるようなこと言ったんだから
まず当たり前の結果を受け入れろ
406デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/12/01(木) 10:15:41.20ID:jAeBwf3w0407デフォルトの名無しさん (オイコラミネオ MMab-/SwU)
2022/12/01(木) 11:33:26.84ID:K0S28fMrM ハッシュというのは、ある種のデータ構造の一種に名付けられた名前で、
検索を速くするためにハッシュ値を使う方式。
unsigned int hash = CalcHash(key);
でハッシュ値を計算し、
Node *p_hash_table[hash];
でデータのリストに即座にたどり着くような方式。
普通に線形検索する場合と比べて検索が劇的に速くなる。
なので連想配列が必ずハッシュ方式であるとは限らない。
また、配列はコンピュータ科学ではメモリー上でデータを連続的に隣接して配置する
単純なデータ構造に名付けられたものであって、ハッシュ構造(方式)とは区別されている。
検索を速くするためにハッシュ値を使う方式。
unsigned int hash = CalcHash(key);
でハッシュ値を計算し、
Node *p_hash_table[hash];
でデータのリストに即座にたどり着くような方式。
普通に線形検索する場合と比べて検索が劇的に速くなる。
なので連想配列が必ずハッシュ方式であるとは限らない。
また、配列はコンピュータ科学ではメモリー上でデータを連続的に隣接して配置する
単純なデータ構造に名付けられたものであって、ハッシュ構造(方式)とは区別されている。
408デフォルトの名無しさん (オイコラミネオ MMab-/SwU)
2022/12/01(木) 11:39:01.75ID:K0S28fMrM >>407
訂正:
誤: Node *p_hash_table[hash];
正:
constexpr unsigned int HASH_MAX = 4096;
Node *p_hash_table[HASH_MAX];
・・・
// 典型的なハッシュ方式による検索関数 :
Node *SearchData(string &key) {
unsigned int hash = CalcHash(key); // とても高速にkeyに対するハッシュ値を計算。
Node *pNode = p_hash_table[hash]; // 同じhash値に属する全てのNodeのリンクリスト
while (1) {
if (pNode->key == key) {
return pNode;
}
pNode = pNode->pNext;
}
}
テキトーに書いたのでまだ書き間違いが残っているかも知れないが、大体こんな感じ。
訂正:
誤: Node *p_hash_table[hash];
正:
constexpr unsigned int HASH_MAX = 4096;
Node *p_hash_table[HASH_MAX];
・・・
// 典型的なハッシュ方式による検索関数 :
Node *SearchData(string &key) {
unsigned int hash = CalcHash(key); // とても高速にkeyに対するハッシュ値を計算。
Node *pNode = p_hash_table[hash]; // 同じhash値に属する全てのNodeのリンクリスト
while (1) {
if (pNode->key == key) {
return pNode;
}
pNode = pNode->pNext;
}
}
テキトーに書いたのでまだ書き間違いが残っているかも知れないが、大体こんな感じ。
409デフォルトの名無しさん (オイコラミネオ MMab-/SwU)
2022/12/01(木) 11:42:25.52ID:K0S28fMrM410デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/12/01(木) 11:58:47.42ID:z3JhSYjVd411デフォルトの名無しさん (ワッチョイ 97e4-LL8a)
2022/12/01(木) 12:01:17.00ID:DPfpWvvy0412デフォルトの名無しさん (オイコラミネオ MMab-/SwU)
2022/12/01(木) 12:15:49.58ID:cs2lswThM >>411
Yes。
最後は逆だった。つまり正しくは:
1は、unorderd_map、unorderd_set、unorderd_multimap、unorderd_multiset
2は、map、set、multimap、multiset
Yes。
最後は逆だった。つまり正しくは:
1は、unorderd_map、unorderd_set、unorderd_multimap、unorderd_multiset
2は、map、set、multimap、multiset
413デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/12/01(木) 13:40:04.60ID:jAeBwf3w0414デフォルトの名無しさん (ワッチョイ ffbb-NZIw)
2022/12/01(木) 13:41:01.80ID:mifNHULm0415デフォルトの名無しさん (オイコラミネオ MMab-/SwU)
2022/12/01(木) 14:11:29.45ID:cs2lswThM >>414
MD5などのハッシュとハッシュ法の役割や目的が結構違いまっせ。
前者はデータが改竄されてないかをチェックするために用い、
後者は検索・探索の高速化のために用いる。
恐らく、もとは後者から用いられ始めたのだと思う。知らないけど。
MD5などのハッシュとハッシュ法の役割や目的が結構違いまっせ。
前者はデータが改竄されてないかをチェックするために用い、
後者は検索・探索の高速化のために用いる。
恐らく、もとは後者から用いられ始めたのだと思う。知らないけど。
416デフォルトの名無しさん (ササクッテロラ Spcb-bAlK)
2022/12/01(木) 14:14:27.23ID:AUjqBN3gp 目的が違えどハッシュ関数的には同じ事だよな
417デフォルトの名無しさん (ワッチョイ 5701-L9hK)
2022/12/01(木) 15:09:39.09ID:9MCw0pWF0418デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/12/01(木) 15:12:17.53ID:vIp4VJD/d >>413=247
さっさと謝ればこんなに恥かかずに済んだのになw
さっさと謝ればこんなに恥かかずに済んだのになw
419デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/12/01(木) 15:13:34.54ID:vIp4VJD/d 227もおまえだろ
420デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/12/01(木) 15:27:34.21ID:jAeBwf3w0421デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/12/01(木) 16:24:34.04ID:aZoVsAyUd そう来ると思ったよ
わかりやすい奴だなw
はいはい、別人なんでちゅねー
わかりやすい奴だなw
はいはい、別人なんでちゅねー
422デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/12/01(木) 16:53:17.94ID:jAeBwf3w0423デフォルトの名無しさん (スップ Sd3f-R/SA)
2022/12/01(木) 17:54:20.55ID:lhJJhxvyd 何がハッシュおじをここまで駆り立てるのか。
424デフォルトの名無しさん (スプッッ Sd3f-Is/7)
2022/12/01(木) 18:24:44.11ID:DTbt9ryPd425デフォルトの名無しさん (ササクッテロラ Spcb-bAlK)
2022/12/01(木) 18:51:12.68ID:paGUeF47p もうハッシュの話はお腹いっぱいだから打ち止めようぜ
426デフォルトの名無しさん (ワッチョイ 97f0-CQqz)
2022/12/01(木) 18:59:15.32ID:LzodZf+Q0 はい次
427デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/12/01(木) 19:04:03.61ID:jAeBwf3w0428デフォルトの名無しさん (ワッチョイ 9701-zuBb)
2022/12/01(木) 19:12:45.42ID:mPKw+fm50 ハッシュのおかげで今週は皆楽しかっただろ。
ちゃんとお礼言っとけよ。
ちゃんとお礼言っとけよ。
429デフォルトの名無しさん (ワッチョイ b7da-7Xgw)
2022/12/01(木) 19:46:37.26ID:/Yq43jiI0 ハッシュも知らんのか
近頃の若造は
近頃の若造は
430デフォルトの名無しさん (アウアウウー Sa5b-CLnV)
2022/12/01(木) 20:11:16.69ID:V7pPuh7Ha ハッシュ!ハッシュ!ドラッケン!
431デフォルトの名無しさん (ワッチョイ 9701-zuBb)
2022/12/01(木) 22:28:42.84ID:mPKw+fm50 ハッシュは配列のことだろ?
432デフォルトの名無しさん (ワッチョイ f71f-rzij)
2022/12/01(木) 23:01:45.25ID:zH8jCNhA0 ハッシュドビーフのことだろ
433デフォルトの名無しさん (オイコラミネオ MMab-/SwU)
2022/12/02(金) 00:20:40.99ID:h6/3aIZ1M >>416
英語の辞書でhashを引くと、「細切れ」「細かく切る」と出てくる。
これは、検索を高速化するためのHash法のHashテーブルが細かく切って
データを格納していることと対応しているようだ。
つまり、Hashという言葉の由来はこのHash法から来ていると推定できて、
Hash関数や、Hash値という言葉もHash法由来のはず。
だから、MD5などのHash値は、Hash法よりも後発のはず。
つまり、Hashというのは、もともと「Hashデータ構造」に対応していて、
MD5などの値を「Hash値」と呼ぶのは「あとづけ」と考えられる。
英語の辞書でhashを引くと、「細切れ」「細かく切る」と出てくる。
これは、検索を高速化するためのHash法のHashテーブルが細かく切って
データを格納していることと対応しているようだ。
つまり、Hashという言葉の由来はこのHash法から来ていると推定できて、
Hash関数や、Hash値という言葉もHash法由来のはず。
だから、MD5などのHash値は、Hash法よりも後発のはず。
つまり、Hashというのは、もともと「Hashデータ構造」に対応していて、
MD5などの値を「Hash値」と呼ぶのは「あとづけ」と考えられる。
434デフォルトの名無しさん (オイコラミネオ MMab-/SwU)
2022/12/02(金) 00:33:19.34ID:h6/3aIZ1M >>433
[補足]
何が言いたいかというと、もともとHashという言葉は、Hash法由来で、
Hash値という言葉も、Hash法から来ていて、
Hash値やHash関数が先でHash法が後、ということ「ではない」。
Hash法を実現したいために、Hash値を求める方法が工夫された。
Hash法 ---> Hash 値 (by Hash関数)
が正しい起源。
もう一度言う、Hash値を使っているからHash法なのではない。
Hash法を実現するために作る値がHash値。
[補足]
何が言いたいかというと、もともとHashという言葉は、Hash法由来で、
Hash値という言葉も、Hash法から来ていて、
Hash値やHash関数が先でHash法が後、ということ「ではない」。
Hash法を実現したいために、Hash値を求める方法が工夫された。
Hash法 ---> Hash 値 (by Hash関数)
が正しい起源。
もう一度言う、Hash値を使っているからHash法なのではない。
Hash法を実現するために作る値がHash値。
435デフォルトの名無しさん (ワッチョイ 9f28-9ylf)
2022/12/02(金) 00:34:37.55ID:eNwFIhhK0 >>433
別に
別に
436デフォルトの名無しさん (ワッチョイ 9f28-9ylf)
2022/12/02(金) 00:35:31.14ID:eNwFIhhK0437デフォルトの名無しさん (ワッチョイ 9f28-9ylf)
2022/12/02(金) 00:45:49.71ID:eNwFIhhK0 >検索を高速化するためのHash法
しかしねえハッシュは本来は実用的なメモリ使用量でメモリに乗りきらないサイズの集合の要素を取り扱うためのしくみなのだから、
入力集合の全単射写像ならハッシュにする意味が無いのだから、
検索を高速化する用途の方が後付けなのだから、
しかしねえハッシュは本来は実用的なメモリ使用量でメモリに乗りきらないサイズの集合の要素を取り扱うためのしくみなのだから、
入力集合の全単射写像ならハッシュにする意味が無いのだから、
検索を高速化する用途の方が後付けなのだから、
438デフォルトの名無しさん (ワッチョイ 9f28-9ylf)
2022/12/02(金) 00:48:00.35ID:eNwFIhhK0 ウィキの冒頭にあるようにハッシュというのは検索というよりは区別のためのしくみなのだから、
MDとかSHA-1とかの方こそが本来の意味でのハッシュなのだから、
MDとかSHA-1とかの方こそが本来の意味でのハッシュなのだから、
439デフォルトの名無しさん (ワッチョイ 9f28-9ylf)
2022/12/02(金) 00:50:17.77ID:eNwFIhhK0 キャッシュメモリもキャッシュメモリに収まりきらないデータをキャッシュメモリに収めるためにハッシュなのだから、
440デフォルトの名無しさん (ワッチョイ ffcf-ykd8)
2022/12/02(金) 00:50:49.40ID:VfaFcsHC0 Perl のハッシュは、もともとは連想配列 (associative array) という名前で呼ばれていましたが、
この名前は長すぎるので、1995 年頃に、Perl コミュニティの中でハッシュ (hash) と呼ぼうということになりました。
Perl5 の時代からはハッシュと呼ぶことになっています。
ハッシュという名前は、連想配列の「実装」に使われるハッシュテーブル (hash table) に由来しています
以上、あくまでもPerl コミュニティの話で、他のコミュニティで流用したら、こんな風にひと悶着起こすわけです
この名前は長すぎるので、1995 年頃に、Perl コミュニティの中でハッシュ (hash) と呼ぼうということになりました。
Perl5 の時代からはハッシュと呼ぶことになっています。
ハッシュという名前は、連想配列の「実装」に使われるハッシュテーブル (hash table) に由来しています
以上、あくまでもPerl コミュニティの話で、他のコミュニティで流用したら、こんな風にひと悶着起こすわけです
441デフォルトの名無しさん (ワッチョイ 9f28-9ylf)
2022/12/02(金) 00:51:31.02ID:eNwFIhhK0 いやしつれいキャッシュメモリのハッシュ利用は検索のためやなサーセン;;;
442デフォルトの名無しさん (ワッチョイ 9f28-9ylf)
2022/12/02(金) 01:06:10.28ID:eNwFIhhK0 どういうことかというとxの検索ではxそのものが取り出されねばならないからxのハッシュはxの検索を利用するユーザーからは見えないから脇役
(別段ハッシュを使わない検索手段で実装してもユーザーにはそれはわからない
一方MD5とかSHA-1とからは長いデータが実用的に無視できる確率でしか衝突しない短いハッシュになるというのがウリなので
MD5とかSHA-1を利用するユーザーはMD5とかSHA-1とかのハッシュそのものを目の当たりにするという違いがある、
というしくみ、
(別段ハッシュを使わない検索手段で実装してもユーザーにはそれはわからない
一方MD5とかSHA-1とからは長いデータが実用的に無視できる確率でしか衝突しない短いハッシュになるというのがウリなので
MD5とかSHA-1を利用するユーザーはMD5とかSHA-1とかのハッシュそのものを目の当たりにするという違いがある、
というしくみ、
443デフォルトの名無しさん (オイコラミネオ MMab-/SwU)
2022/12/02(金) 01:47:39.50ID:h6/3aIZ1M444デフォルトの名無しさん (アウアウウー Sa5b-CLnV)
2022/12/02(金) 02:01:39.85ID:cil6LVtpa ハッシュ関数の操作にハッシュ感があるんじゃ?
445デフォルトの名無しさん (オイコラミネオ MMab-/SwU)
2022/12/02(金) 02:17:32.59ID:h6/3aIZ1M >>444
Wikipedia英語版のHash tableの項目を見てみると、
The idea of hashing arose independently in different places.
In January 1953, Hans Peter Luhn wrote an internal IBM memorandum
that used hashing with chaining. Open addressing was later proposed
by A. D. Linh building on Luhn's paper.[7]: 15
となっていて、「hashing」がhash tableの概念をそのまま対応していると
考えられる。hashingのアイデアそのものがhash tableのために生み出されたようだ。
Wikipedia英語版のHash tableの項目を見てみると、
The idea of hashing arose independently in different places.
In January 1953, Hans Peter Luhn wrote an internal IBM memorandum
that used hashing with chaining. Open addressing was later proposed
by A. D. Linh building on Luhn's paper.[7]: 15
となっていて、「hashing」がhash tableの概念をそのまま対応していると
考えられる。hashingのアイデアそのものがhash tableのために生み出されたようだ。
446デフォルトの名無しさん (ワッチョイ 9701-zuBb)
2022/12/02(金) 07:20:08.20ID:DFt0sUTo0 要約すると、ハッシュ法とは配列のことで良いだろ?
447デフォルトの名無しさん (ワッチョイ b7da-7Xgw)
2022/12/02(金) 07:32:42.95ID:7ZxLA8W50 インデックスじゃなくてキー式の配列な
448デフォルトの名無しさん (アウアウウー Sa5b-CLnV)
2022/12/02(金) 09:21:43.88ID:7d7w3eSQa449デフォルトの名無しさん (ササクッテロラ Spcb-bAlK)
2022/12/02(金) 10:47:13.00ID:pILexyP1p とある辞書のインデックス
450デフォルトの名無しさん (オイコラミネオ MMab-+AMV)
2022/12/02(金) 12:51:51.38ID:PuSvdAs7M >>446
JSでは、
a[key] = val
でハッシュ法を使ったデータに書き込めるから形式的に配列と同じになっているが、
「アルゴリズムとデータ構造」では、ハッシュ法は配列とは完全に区別されている。
JSでは、
a[key] = val
でハッシュ法を使ったデータに書き込めるから形式的に配列と同じになっているが、
「アルゴリズムとデータ構造」では、ハッシュ法は配列とは完全に区別されている。
451デフォルトの名無しさん (スップ Sd3f-CQqz)
2022/12/02(金) 12:56:29.48ID:5fL6YCldd C++スレだから用語の定義もC++が前提
452デフォルトの名無しさん (ワッチョイ f79c-YdBL)
2022/12/02(金) 16:13:02.65ID:ahpGcODy0 ハッシュはキー長固定が前提だけど、配列は(概念的には)固定長前提では無いので、この2つを同一視するのは無理がある。
そもそも配列にキー衝突の概念無いだろ。
配列の場合、キーが異なれば衝突しない。
そもそも配列にキー衝突の概念無いだろ。
配列の場合、キーが異なれば衝突しない。
453デフォルトの名無しさん (ワッチョイ f79c-YdBL)
2022/12/02(金) 16:14:30.69ID:ahpGcODy0454デフォルトの名無しさん (スップ Sdbf-Is/7)
2022/12/02(金) 17:48:37.71ID:u75NJDvrd455デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/12/02(金) 18:11:06.69ID:tKD1RDkG0 まあせいぜい逃げ回ってりゃいいんじゃね?w
456デフォルトの名無しさん (ササクッテロラ Spcb-bAlK)
2022/12/02(金) 18:16:29.52ID:V13bE4eep まだやってんw
457デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/12/02(金) 18:24:41.37ID:tKD1RDkG0458デフォルトの名無しさん (オイコラミネオ MMab-+AMV)
2022/12/02(金) 18:29:46.96ID:l1cskCXdM >>452
数学的概念としては、独自に同一視して理論を展開することも可能だが、
そもそも、配列のa[idx]はマシン語の1命令でアクセスできて、1クロックなのに
対して、ハッシュの x[key]は、150クロック〜数千クロック程度かかる。
(少なくとも後者はCPUで1命令(1クロック)では処理できない。)
数学的概念としては、独自に同一視して理論を展開することも可能だが、
そもそも、配列のa[idx]はマシン語の1命令でアクセスできて、1クロックなのに
対して、ハッシュの x[key]は、150クロック〜数千クロック程度かかる。
(少なくとも後者はCPUで1命令(1クロック)では処理できない。)
459デフォルトの名無しさん (ササクッテロラ Spcb-bAlK)
2022/12/02(金) 18:31:22.54ID:V13bE4eep >>458
配列の型によるだろ、嘘教えるなよw
配列の型によるだろ、嘘教えるなよw
460デフォルトの名無しさん (ワッチョイ 9f01-YdBL)
2022/12/02(金) 18:45:28.13ID:tKD1RDkG0 そもそもメモリーアクセスが1クロックでできるかどうかは状況によるしハッシュの計算に150クロック以上とかどこから出てきたんだ?
461デフォルトの名無しさん (オイコラミネオ MMab-+AMV)
2022/12/02(金) 18:47:05.45ID:l1cskCXdM462デフォルトの名無しさん (アウアウウー Sa5b-tFPE)
2022/12/02(金) 20:50:07.24ID:mpDpMcgja シッタカが自爆するスレ
463デフォルトの名無しさん (ワッチョイ b7da-7Xgw)
2022/12/02(金) 21:13:31.85ID:7ZxLA8W50 ハッシュはキーがぶつかった時にネストして候補を洗ってく時間がかかるから一意に150クロックってワケでもない
464デフォルトの名無しさん (ワッチョイ d75f-JadS)
2022/12/02(金) 21:26:41.80ID:OAAJQcGw0 Pythonで経過時刻を測る場合、以下のような方法を使いますが
C++でPythonと同じ計測手法を使うにはどうしたら良いですか?
import time
startTime = time.time()
nowTime = time.time() - startTime
print(nowTime)
C++でPythonと同じ計測手法を使うにはどうしたら良いですか?
import time
startTime = time.time()
nowTime = time.time() - startTime
print(nowTime)
465デフォルトの名無しさん (ササクッテロラ Spcb-bAlK)
2022/12/02(金) 21:29:14.69ID:jlYcEgfQp OSに依るからなぁ
466デフォルトの名無しさん (ワッチョイ 1710-LL8a)
2022/12/02(金) 21:30:36.64ID:RyVNohK20 なんか面倒くさい<chrono>でがんばる
467デフォルトの名無しさん (ワッチョイ d75f-JadS)
2022/12/02(金) 21:33:56.38ID:OAAJQcGw0 >>465
Windows限定で使用する予定です。
Windows限定で使用する予定です。
468デフォルトの名無しさん (テテンテンテン MM8f-YdBL)
2022/12/02(金) 21:36:34.16ID:m95xgUV8M boost::timer::cpu_timerとか?
469デフォルトの名無しさん (ワッチョイ 9f02-CHuw)
2022/12/02(金) 21:41:06.49ID:110d0P8E0 >>467
C++ 関係ないけどパフォーマンスカウンターでggrと良いんでは?
C++ 関係ないけどパフォーマンスカウンターでggrと良いんでは?
470デフォルトの名無しさん (ワッチョイ 5701-L9hK)
2022/12/02(金) 21:45:16.03ID:FW7hEQSS0 std::time とか?
471デフォルトの名無しさん (ワッチョイ 17c2-RPwI)
2022/12/02(金) 21:48:04.00ID:0Xa+fucj0472デフォルトの名無しさん (ワッチョイ 9f28-9ylf)
2022/12/02(金) 22:24:02.82ID:eNwFIhhK0 OpenMPの一部であるomp_get_wtime()がじつはパフォーマンスカウンタと同じ精度……
ポータブル……
ポータブル……
473デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/03(土) 00:29:43.64ID:dPKr1JJoM474デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/03(土) 01:21:25.79ID:dPKr1JJoM >>463
要は、JSなどで配列とHash法が同じ書き方が出来るが故に、Hash法が
「配列」みたいには高速ではないということを知らない人が居るのではないかと
思って書いただけ。
x86系の場合、配列は、要素サイズが1,2,4,8の時はa[i]がマシン語の1命令で
1クロック、それ以外の一般サイズだと2命令で、今のCPUだと、
4クロック〜20クロック程度。
ハッシュ法だと、keyが10文字の文字列の場合で、最低でも、まあ、100クロック位
はかかると見ておいたほうがいい。最高だと上限は無いが、まあ、数千〜数万
クロック程度になると考えた方がいい。
これは、マシン語まで見たときの常識的な間隔。
要は、JSなどで配列とHash法が同じ書き方が出来るが故に、Hash法が
「配列」みたいには高速ではないということを知らない人が居るのではないかと
思って書いただけ。
x86系の場合、配列は、要素サイズが1,2,4,8の時はa[i]がマシン語の1命令で
1クロック、それ以外の一般サイズだと2命令で、今のCPUだと、
4クロック〜20クロック程度。
ハッシュ法だと、keyが10文字の文字列の場合で、最低でも、まあ、100クロック位
はかかると見ておいたほうがいい。最高だと上限は無いが、まあ、数千〜数万
クロック程度になると考えた方がいい。
これは、マシン語まで見たときの常識的な間隔。
475デフォルトの名無しさん (ワッチョイ d8cf-R4o2)
2022/12/03(土) 02:42:14.20ID:ngGiofKr0 マシン語の1命令で1クロックって、いつの何のCPUだ
476デフォルトの名無しさん (ブーイモ MM5e-mM0k)
2022/12/03(土) 08:52:01.00ID:+FzzA9JIM 0 以上 64 以下の整数 n に対して 2^n-1 (ビットごとの排他的 OR 演算子ではなく累乗の意味 2**n-1 です)を std::uint64_t 型で返す関数って場合分け無しでスッキリ書けませんかね?
477はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/03(土) 09:18:16.49ID:riW5om/o0478デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/03(土) 09:23:14.36ID:qMCuKdke0 std::uint64_tの加算オーバーフロー時の挙動がunsigned intと同様にwrap aroundなんなら普通に
std::uint64_t foo(const int n) { return ((std::int64_t)1 << n) - (std::int64_t)1; }
で良くねconstexpr的な何かとかでマズい?
std::uint64_t foo(const int n) { return ((std::int64_t)1 << n) - (std::int64_t)1; }
で良くねconstexpr的な何かとかでマズい?
479はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/03(土) 09:26:37.99ID:riW5om/o0 すまぬ。 >>477 だと n が 0 のときは未定義なのでそれだけ場合分けが必要になってしまうな。
だからといって (std::uint64_t(1) << n) - 1 だと 64 のときが駄目だし、
場合分け無しという条件だと思ったよりめんどいかも?
だからといって (std::uint64_t(1) << n) - 1 だと 64 のときが駄目だし、
場合分け無しという条件だと思ったよりめんどいかも?
480デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/03(土) 09:43:52.56ID:qMCuKdke0 違った加算オーバーフローの話やなかったorz
シフト演算については
If E1 has an unsigned
type, the value of the result is E1 × 2E2, reduced modulo one more than the maximum value representable
in the result type.
E1 が符号なし型を持つ場合、結果の値は、E1 * 2E2 の、結果の型で表現可能な最大値より 1 大きい値を法とする剰余となる
なので言語規格上は (uint64_t)1 << 64は合法なはず……
シフト演算については
If E1 has an unsigned
type, the value of the result is E1 × 2E2, reduced modulo one more than the maximum value representable
in the result type.
E1 が符号なし型を持つ場合、結果の値は、E1 * 2E2 の、結果の型で表現可能な最大値より 1 大きい値を法とする剰余となる
なので言語規格上は (uint64_t)1 << 64は合法なはず……
481デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/03(土) 09:49:24.58ID:qMCuKdke0 訂正orz
誤: 2E2
正: 2**E2 (2のE2乗)
符号付きの型はオーバーフローで例外を発生するアーキテクチャーがあるから
表現できるビット数からあふれるコーディングは未定義動作か何かやが
符号無し型はモジュロ演算になるから溢れてもおk
と言う印象(記憶モード
※ 個人の感想です
誤: 2E2
正: 2**E2 (2のE2乗)
符号付きの型はオーバーフローで例外を発生するアーキテクチャーがあるから
表現できるビット数からあふれるコーディングは未定義動作か何かやが
符号無し型はモジュロ演算になるから溢れてもおk
と言う印象(記憶モード
※ 個人の感想です
482はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/03(土) 10:04:27.89ID:riW5om/o0 >>478
> https://timsong-cpp.github.io/cppwp/n3337/expr.shift
> The behavior is undefined if the right operand is negative, or greater than
> or equal to the length in bits of the promoted left operand.
シフト演算子では右オペランドが (昇格済みの) 左オペランドの幅以上の値だったときは未定義。
> https://timsong-cpp.github.io/cppwp/n3337/expr.shift
> The behavior is undefined if the right operand is negative, or greater than
> or equal to the length in bits of the promoted left operand.
シフト演算子では右オペランドが (昇格済みの) 左オペランドの幅以上の値だったときは未定義。
483はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/03(土) 10:15:30.26ID:riW5om/o0 std::bitset を経由すれば大丈夫だということを発見した。
std::uint64_t((compl std::bitset<64>(0)>>(64-n)).to_ullong())
これを「スッキリ」といえるかどうかは微妙なところかもしれぬ……。
std::uint64_t((compl std::bitset<64>(0)>>(64-n)).to_ullong())
これを「スッキリ」といえるかどうかは微妙なところかもしれぬ……。
484デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/03(土) 11:26:23.20ID:qMCuKdke0 >>482
わかりた
ではこう汁、
指数 n == (n/2) + (n/2) + (n & 1) ※ 除算は結果の小数以下切り捨て
ので
2**n - 1 = 2**((n/2) + (n/2) + (n & 1)) - 1
= 2**(n/2) * 2**(n/2) * 2**(n&1) - 1
よって
std::uint64_t foo(const int n) {
const std::int64_t x = (std::uint64_t)1 << (n / 2);
return (x * x * ((std::uint64_t)1 << (n & 1)) - (std::int64_t)1;
}
でだいたいおk、
わかりた
ではこう汁、
指数 n == (n/2) + (n/2) + (n & 1) ※ 除算は結果の小数以下切り捨て
ので
2**n - 1 = 2**((n/2) + (n/2) + (n & 1)) - 1
= 2**(n/2) * 2**(n/2) * 2**(n&1) - 1
よって
std::uint64_t foo(const int n) {
const std::int64_t x = (std::uint64_t)1 << (n / 2);
return (x * x * ((std::uint64_t)1 << (n & 1)) - (std::int64_t)1;
}
でだいたいおk、
485デフォルトの名無しさん (ワッチョイ 2647-fbc4)
2022/12/03(土) 11:32:11.79ID:D7LggL4j0 n?1ull<<(n-1):0
486デフォルトの名無しさん (スップ Sd02-HF5l)
2022/12/03(土) 11:45:55.06ID:Xj+KmoE3d487デフォルトの名無しさん (スップ Sd02-HF5l)
2022/12/03(土) 11:53:09.20ID:Xj+KmoE3d constexpr uint64_t TABLE[65] = {
0x0000000000000000,
0x0000000000000001,
0x0000000000000003,
...
0xffffffffffffffff
};
return TABLE[n];
0x0000000000000000,
0x0000000000000001,
0x0000000000000003,
...
0xffffffffffffffff
};
return TABLE[n];
488デフォルトの名無しさん (スップ Sd02-HF5l)
2022/12/03(土) 11:57:41.15ID:Xj+KmoE3d x86-64の場合
shl reg, clのclは下位6bitしか見ないから
1ull<<nが正しく動いた場合マシン語レベルでは分岐してることになる
shl reg, clのclは下位6bitしか見ないから
1ull<<nが正しく動いた場合マシン語レベルでは分岐してることになる
489デフォルトの名無しさん (ワッチョイ 9fc2-4FAg)
2022/12/03(土) 21:09:42.26ID:WYd/d9iJ0490デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/03(土) 23:32:15.77ID:qMCuKdke0 (ID:Xj+KmoE3d が天才すぎてつらいので埋め)
491デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/03(土) 23:46:07.24ID:mCv82Mp+M ところで、C++でも、Javab磴#でも、メモャ梶[不足例外を封竭ォしない風潮bノなっている
ようです。それは、メモリー不足が起きる可能性があるところの、
文字列合成やコンテナ要素追加が簡単に書けるようになった反面、
その全ての箇所でエラー処理をするのはめんどくさすぎるという
事情から来ていると思います。
しかし、テキスとエディタなどで、一文字や一行追加した時にメモリーが確保できない
場合に、「メモリーが一杯です」などと表示することはMS-DOSならよくあったことで、
そのような場合にメモリー不足例外を補足する事は原理的には可能です。
いまや、そのような場合のメモリー不足はほぼ起き得なくなってますが、エラーを感知
しないで本当に良いと思われますか?
もっと進めれば、メモリー不足例外は、商用アプリでも「完全無視」を決め込んでも良いと
思われますか?
ようです。それは、メモリー不足が起きる可能性があるところの、
文字列合成やコンテナ要素追加が簡単に書けるようになった反面、
その全ての箇所でエラー処理をするのはめんどくさすぎるという
事情から来ていると思います。
しかし、テキスとエディタなどで、一文字や一行追加した時にメモリーが確保できない
場合に、「メモリーが一杯です」などと表示することはMS-DOSならよくあったことで、
そのような場合にメモリー不足例外を補足する事は原理的には可能です。
いまや、そのような場合のメモリー不足はほぼ起き得なくなってますが、エラーを感知
しないで本当に良いと思われますか?
もっと進めれば、メモリー不足例外は、商用アプリでも「完全無視」を決め込んでも良いと
思われますか?
492デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/03(土) 23:47:44.27ID:mCv82Mp+M >>491
携帯SIMを使っているので電波にエラーが生じたらしいです:
誤:ところで、C++でも、Javab磴#でも、メモャ梶[不足例外を封竭ォしない風潮bノなっている
正:ところで、C++でも、JavaやC#でも、メモリ不足例外を補足しない風潮になっている
携帯SIMを使っているので電波にエラーが生じたらしいです:
誤:ところで、C++でも、Javab磴#でも、メモャ梶[不足例外を封竭ォしない風潮bノなっている
正:ところで、C++でも、JavaやC#でも、メモリ不足例外を補足しない風潮になっている
493デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/04(日) 00:02:09.11ID:r/mQBEYb0 >エラーを感知 しないで本当に良いと思われますか?
良い
どうせメモリ不足になったら有効なことはほとんど何もできない
ただしそのかわり処理の不意の中断から絶対に保護すべきリソースとか絶対動かしたままにしてはいけない処理は
例外安全なクラスで管理して確実にクローズ処理せねばならない
jこれはメモリ不足の状況でも同じで、そういうのはヒープを使わないで書くのが最善やが、
内部でヒープを使うライブラリに依存している等でヒープをどうしても使わざるおえないの場合は
事前malloc()→例外捕捉時に解放、というテクが昔からあっる
良い
どうせメモリ不足になったら有効なことはほとんど何もできない
ただしそのかわり処理の不意の中断から絶対に保護すべきリソースとか絶対動かしたままにしてはいけない処理は
例外安全なクラスで管理して確実にクローズ処理せねばならない
jこれはメモリ不足の状況でも同じで、そういうのはヒープを使わないで書くのが最善やが、
内部でヒープを使うライブラリに依存している等でヒープをどうしても使わざるおえないの場合は
事前malloc()→例外捕捉時に解放、というテクが昔からあっる
494デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:02:21.62ID:BcAMllhiM スタック的な(?)コンテナで、pop_back()メソッドは戻り値が void型で、
つまり、pop したデータを返しませんが、BJ. stroustrup氏によれば、
それもreturn文で要素をコピー(?)する際に、メモリー不足例外が起きる
可能性考慮したとのことです。
どうしてmoveじゃ駄目なのかもし分かりませんでしたが。
つまり、pop したデータを返しませんが、BJ. stroustrup氏によれば、
それもreturn文で要素をコピー(?)する際に、メモリー不足例外が起きる
可能性考慮したとのことです。
どうしてmoveじゃ駄目なのかもし分かりませんでしたが。
495デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:04:34.95ID:BcAMllhiM >>493
>どうせメモリ不足になったら有効なことはほとんど何もできない
MS-DOSの時、テキストエディタなどではメモリー不足になると、
ちゃんとメッセージを出して、なおかつ、その後もメモリーが無い割には
安定動作してました。
>どうせメモリ不足になったら有効なことはほとんど何もできない
MS-DOSの時、テキストエディタなどではメモリー不足になると、
ちゃんとメッセージを出して、なおかつ、その後もメモリーが無い割には
安定動作してました。
496デフォルトの名無しさん (ワッチョイ aa01-QZbE)
2022/12/04(日) 00:11:51.06ID:S/+N28Tr0497デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/04(日) 00:17:03.45ID:r/mQBEYb0498デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/04(日) 00:20:25.80ID:r/mQBEYb0 >>495
おま環、
おま環、
499デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:31:29.29ID:BcAMllhiM >>497
>x = queue.pop();
>というのを許すキューの仕様だと
>とキュー上のx'とそのコピーxが同時に存在するタイミングが一瞬生じてメモリ不足になりかねないという
よく分かりません。できればもっと詳しくお願いできませんか。
キュー上の x' を x に move すれば駄目なのでしょうか?
>xにムーブコンストラが定義してありqueue.pop()をムーブ対応に設計したとしても
>ムーブコンストラクタが呼ばれる時間の無駄は相変わらず存在する
>最も効率が良いのはpop()するタイミングまでキュー上のオブジェクトの参照を返し、
>pop()するタイミングではキュー上のオブジェクトの破棄のみ行うという現行のインターフェース、
なるほど、参照で返すのは効率がよいのは分かりますが、stroustrup氏によれば、moveは
速いと主張されているわけです。
私はmoveより参照の方が効率が良いと常々思っておりましたが。
彼はmoveが大好きなはずなのですが。
>x = queue.pop();
>というのを許すキューの仕様だと
>とキュー上のx'とそのコピーxが同時に存在するタイミングが一瞬生じてメモリ不足になりかねないという
よく分かりません。できればもっと詳しくお願いできませんか。
キュー上の x' を x に move すれば駄目なのでしょうか?
>xにムーブコンストラが定義してありqueue.pop()をムーブ対応に設計したとしても
>ムーブコンストラクタが呼ばれる時間の無駄は相変わらず存在する
>最も効率が良いのはpop()するタイミングまでキュー上のオブジェクトの参照を返し、
>pop()するタイミングではキュー上のオブジェクトの破棄のみ行うという現行のインターフェース、
なるほど、参照で返すのは効率がよいのは分かりますが、stroustrup氏によれば、moveは
速いと主張されているわけです。
私はmoveより参照の方が効率が良いと常々思っておりましたが。
彼はmoveが大好きなはずなのですが。
500デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/04(日) 00:37:44.43ID:r/mQBEYb0501デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:41:37.02ID:BcAMllhiM >>500
>ムーブコンストラが呼ばれる時間の無駄がある(2回目
なるほど、ならば、スタックポインタだけ元に戻して、値は捨ててしまう
バージョンの pop を用意すれば良いだけでは無いですか、今みたいに。
>ムーブコンストラが呼ばれる時間の無駄がある(2回目
なるほど、ならば、スタックポインタだけ元に戻して、値は捨ててしまう
バージョンの pop を用意すれば良いだけでは無いですか、今みたいに。
502デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:43:51.82ID:BcAMllhiM >>501
Strousstrup氏によると、メモリー不足になって例外が生じた場合の
対処が難しい、みたいなことを言っていたと思います。
しかし、moveコンストラクタ/代入を使った場合にはメモリー不足も生じませんし、
moveコンストラクタ/代入は例外を生じさせてはいけない、と彼自身は
普段から何度も言及していたと思うんです。
Strousstrup氏によると、メモリー不足になって例外が生じた場合の
対処が難しい、みたいなことを言っていたと思います。
しかし、moveコンストラクタ/代入を使った場合にはメモリー不足も生じませんし、
moveコンストラクタ/代入は例外を生じさせてはいけない、と彼自身は
普段から何度も言及していたと思うんです。
503デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 00:49:09.96ID:BcAMllhiM >>502
仮にstackの要素クラスにコピーコンストラクタしかない場合は、メモリー不足が
生じてstd::bad_alloc 例外がthrowされる場合があるとは思いますが、難しい
とは言ってもそれが生じた場合に対処が全く出来ないとは思えません。
あるとすれば、要素がmoveコンストラクタを持っている場合でも、
try catch ブロックを書くことで、オーバーヘッドが生じる
場合があることを彼は恐れていたのでしょうか。
仮にstackの要素クラスにコピーコンストラクタしかない場合は、メモリー不足が
生じてstd::bad_alloc 例外がthrowされる場合があるとは思いますが、難しい
とは言ってもそれが生じた場合に対処が全く出来ないとは思えません。
あるとすれば、要素がmoveコンストラクタを持っている場合でも、
try catch ブロックを書くことで、オーバーヘッドが生じる
場合があることを彼は恐れていたのでしょうか。
504デフォルトの名無しさん (ワッチョイ 8a28-BV3Z)
2022/12/04(日) 01:11:37.29ID:r/mQBEYb0 >>501
ムーブしたかったらqueue.front()が返す参照でキュー上のx'をxか何かにムーブするだけ(※1)で良くね↑?
x = std::move(queue.front());
queue.pop_front();
※1: xやx'のクラスにムーブコンストラの定義は必要
>スタックポインタだけ元に戻して、値は捨ててしまう
>バージョンの pop を用意すれば良いだけでは無いですか、今みたいに。
ムーブするpop_front()と、デストラクタを呼ぶだけの今のpop_front()がどこが同じなのかkwsk、
ムーブしたかったらqueue.front()が返す参照でキュー上のx'をxか何かにムーブするだけ(※1)で良くね↑?
x = std::move(queue.front());
queue.pop_front();
※1: xやx'のクラスにムーブコンストラの定義は必要
>スタックポインタだけ元に戻して、値は捨ててしまう
>バージョンの pop を用意すれば良いだけでは無いですか、今みたいに。
ムーブするpop_front()と、デストラクタを呼ぶだけの今のpop_front()がどこが同じなのかkwsk、
505デフォルトの名無しさん (ワッチョイ d8cf-R4o2)
2022/12/04(日) 01:20:22.79ID:qWdYVkpM0 標準例外安全規則と強い保証がどうのこうの
506デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 01:33:30.77ID:BcAMllhiM >>504
マシン語の「pop命令」は伝統的に、スタックポインタを戻すことと、値を読み出すことを
同時に行っていました。
C++の設計では、値の読み出しと、スタックポインタを戻すことが分かれており、命名も
変なのです。
つまり、2つの事を合体させて行なうのが伝統的に「pop」であった伝統や習慣とは
異なる命名をC++はとってしまっているので、心理的に受け入れがたくなっているわけです。
マシン語の「pop命令」は伝統的に、スタックポインタを戻すことと、値を読み出すことを
同時に行っていました。
C++の設計では、値の読み出しと、スタックポインタを戻すことが分かれており、命名も
変なのです。
つまり、2つの事を合体させて行なうのが伝統的に「pop」であった伝統や習慣とは
異なる命名をC++はとってしまっているので、心理的に受け入れがたくなっているわけです。
507デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 01:50:30.99ID:BcAMllhiM >>506
例えば、Rustのpopは、ちゃんとマシン語の伝統と同じく、
戻り値が読み出された値になっていて、かつ、スタックポインタも戻ります。
C++のはどうしてこうなったのか、と思うように伝統を破ってます。
伝統を知らない人が作ったかのように。
例えば、Rustのpopは、ちゃんとマシン語の伝統と同じく、
戻り値が読み出された値になっていて、かつ、スタックポインタも戻ります。
C++のはどうしてこうなったのか、と思うように伝統を破ってます。
伝統を知らない人が作ったかのように。
508デフォルトの名無しさん (ワッチョイ 847c-XFic)
2022/12/04(日) 02:00:59.03ID:6yRfEQxP0 削除と値返却を同時にやるpop()が例外安全的に糞だって話はExceptionalC++に1章割いて載ってたはず
今手元にないけど
今手元にないけど
509デフォルトの名無しさん (ワッチョイ d8cf-R4o2)
2022/12/04(日) 02:03:07.32ID:qWdYVkpM0 C++だけでなく、いくつかの言語で、配列にアクセスするのに
push() pop() といった名前の関数があるから、その流れじゃないの
対象はあくまでも配列であって、cpu のスタックとは色々異なるわけだし
そこでどこまでスタックぽく扱うかは、言語の仕様というか設計者のお好みによるというかw
push() pop() といった名前の関数があるから、その流れじゃないの
対象はあくまでも配列であって、cpu のスタックとは色々異なるわけだし
そこでどこまでスタックぽく扱うかは、言語の仕様というか設計者のお好みによるというかw
510デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 02:10:09.58ID:BcAMllhiM >>508
その辺の話をここに書いていただけると幸いです。
その辺の話をここに書いていただけると幸いです。
511デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 02:22:20.52ID:BcAMllhiM >>510
自己レスですが、
https://stackoverflow.com/questions/25035691/why-doesnt-stdqueuepop-return-value
これですかね。
[Q] Why doesn't std::queue::pop return value.?
[A]
・・・
So, whats the difference, pop function could have done the same thing.
It could indeed have done the same thing. The reason it didn't, is because a pop that returned the popped element is unsafe in the presence of exceptions (having to return by value and thus creating a copy).
Consider this scenario (with a naive/made up pop implementation, to ilustrate my point):
template<class T>
class queue {
T* elements;
std::size_t top_position;
// stuff here
T pop()
{
auto x = elements[top_position];
// TODO: call destructor for elements[top_position] here
--top_position; // alter queue state here
return x; // calls T(const T&) which may throw
}
If the copy constructor of T throws on return, you have already altered the state of the queue (top_position in my naive implementation) and the element is removed from the queue (and not returned). For all intents and purposes (no matter how you catch the exception in client code) the element at the top of the queue is lost.
This implementation is also inefficient in the case when you do not need the popped value (i.e. it creates a copy of the element that nobody will use).
This can be implemented safely and efficiently, with two separate operations (void pop and const T& front()).
自己レスですが、
https://stackoverflow.com/questions/25035691/why-doesnt-stdqueuepop-return-value
これですかね。
[Q] Why doesn't std::queue::pop return value.?
[A]
・・・
So, whats the difference, pop function could have done the same thing.
It could indeed have done the same thing. The reason it didn't, is because a pop that returned the popped element is unsafe in the presence of exceptions (having to return by value and thus creating a copy).
Consider this scenario (with a naive/made up pop implementation, to ilustrate my point):
template<class T>
class queue {
T* elements;
std::size_t top_position;
// stuff here
T pop()
{
auto x = elements[top_position];
// TODO: call destructor for elements[top_position] here
--top_position; // alter queue state here
return x; // calls T(const T&) which may throw
}
If the copy constructor of T throws on return, you have already altered the state of the queue (top_position in my naive implementation) and the element is removed from the queue (and not returned). For all intents and purposes (no matter how you catch the exception in client code) the element at the top of the queue is lost.
This implementation is also inefficient in the case when you do not need the popped value (i.e. it creates a copy of the element that nobody will use).
This can be implemented safely and efficiently, with two separate operations (void pop and const T& front()).
512デフォルトの名無しさん (スフッ Sd94-sdih)
2022/12/04(日) 10:36:33.77ID:9l16UriTd MMミネヲからはperlerの臭いがする
513デフォルトの名無しさん (ワッチョイ 3602-WJTY)
2022/12/04(日) 11:36:02.70ID:flilPTWf0 0〜255しか格納されないことが保証されている変数aがあって
その変数の値を以下のイメージのように判定する効率的なやり方はないでしょうか
a == {8, 9, 12}
aが{ }内のいずれかの値に該当しているかどうかを判定したいです
{ }はあらかじめ定数でもよいです
その変数の値を以下のイメージのように判定する効率的なやり方はないでしょうか
a == {8, 9, 12}
aが{ }内のいずれかの値に該当しているかどうかを判定したいです
{ }はあらかじめ定数でもよいです
514デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/04(日) 11:40:31.47ID:RAGda7mP0 set<int> unko { 8, 9, 12};
if(unko.find(a) != unko.end()) goto hell;
if(unko.find(a) != unko.end()) goto hell;
515デフォルトの名無しさん (ワッチョイ 0a46-1DcW)
2022/12/04(日) 11:44:07.96ID:AOlAqVGT0 ルックアップテーブル
516デフォルトの名無しさん (ワッチョイ 3602-WJTY)
2022/12/04(日) 11:54:47.89ID:flilPTWf0517デフォルトの名無しさん (ワッチョイ c001-g9pY)
2022/12/04(日) 12:07:00.75ID:JyCGAu5J0 std::bitset<256>はどうですか?
518デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/04(日) 16:18:10.81ID:RV2/jwt7M >>513
BYTE qqq[256] = {};
void init() {
qqq[8]=1;
qqq[9]=1;
qqq[12]=1;
}
inline BOOL IsInQqq(int a)
{
return qqq[a];
}
BYTE qqq[256] = {};
void init() {
qqq[8]=1;
qqq[9]=1;
qqq[12]=1;
}
inline BOOL IsInQqq(int a)
{
return qqq[a];
}
519デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/04(日) 16:45:55.42ID:RAGda7mP0 inline bool is_8_9_12(uint8_t a)
{
return 0b0001'0011'0000'0000 & 1 << a;
}
{
return 0b0001'0011'0000'0000 & 1 << a;
}
520513 (ワッチョイ 3602-WJTY)
2022/12/04(日) 17:30:39.25ID:flilPTWf0 いろいろ例をありがとうございます
pascalからの移行で集合型をどうにか再現できないかと試している中での質問でした
pascalの集合型なら[8, 9, 12](8, 9, 12は一例で、本来は任意の値を指定したい)を
直接使えて便利なので多用していました
アドバイスのおかげで比較は近いことを再現できましたが、
それとは別のケースで[8, 9, 12]を直接関数の引数で指定する方法を探しています
引数で指定する際の値の範囲は0〜31を超えることはなさそうなので
ビットを立てた整数を返す、可変長引数を取る関数を作れば良さそうだと思いました
pascalからの移行で集合型をどうにか再現できないかと試している中での質問でした
pascalの集合型なら[8, 9, 12](8, 9, 12は一例で、本来は任意の値を指定したい)を
直接使えて便利なので多用していました
アドバイスのおかげで比較は近いことを再現できましたが、
それとは別のケースで[8, 9, 12]を直接関数の引数で指定する方法を探しています
引数で指定する際の値の範囲は0〜31を超えることはなさそうなので
ビットを立てた整数を返す、可変長引数を取る関数を作れば良さそうだと思いました
521デフォルトの名無しさん (ワッチョイ aa01-QZbE)
2022/12/04(日) 17:37:18.99ID:S/+N28Tr0522513 (ワッチョイ 3602-WJTY)
2022/12/04(日) 17:49:59.78ID:flilPTWf0 std::bitset<256>も試してみましたが
{8, 9, 12} こういった形式単独で使えるやり方はないかと調べていました
{8, 9, 12} こういった形式単独で使えるやり方はないかと調べていました
523はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/04(日) 18:04:56.88ID:YO7rrhiC0 std::bitset は unsigned long long を受け取るコンストラクタには constexpr が付いてるので
それより小さいビット数の bitset についてならコンパイル時に計算してしまうことも出来る。
それより小さいビット数の bitset についてならコンパイル時に計算してしまうことも出来る。
524はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/04(日) 18:39:41.91ID:YO7rrhiC0 たぶんやりたいのはこういう感じかな。 (想定は C++17 以上)
#include <bitset>
#include <cassert>
#include <climits>
#include <cstddef>
#include <type_traits>
template <std::size_t N = sizeof(unsigned long long int) * CHAR_BIT, class... T>
constexpr std::enable_if_t<(sizeof...(T) <= N), std::bitset<N>>
make_flagged_bitset(T... args) noexcept {
return std::bitset<N>(((1ULL << args) | ...));
}
// 使用例
int main(void) {
constexpr auto table = make_flagged_bitset(8, 9, 12);
// セットしてないところは偽値
assert(table[0] == false);
assert(table[1] == false);
assert(table[10] == false);
assert(table[20] == false);
// セットしているところは真値
assert(table[8] == true);
assert(table[9] == true);
assert(table[12] == true);
}
#include <bitset>
#include <cassert>
#include <climits>
#include <cstddef>
#include <type_traits>
template <std::size_t N = sizeof(unsigned long long int) * CHAR_BIT, class... T>
constexpr std::enable_if_t<(sizeof...(T) <= N), std::bitset<N>>
make_flagged_bitset(T... args) noexcept {
return std::bitset<N>(((1ULL << args) | ...));
}
// 使用例
int main(void) {
constexpr auto table = make_flagged_bitset(8, 9, 12);
// セットしてないところは偽値
assert(table[0] == false);
assert(table[1] == false);
assert(table[10] == false);
assert(table[20] == false);
// セットしているところは真値
assert(table[8] == true);
assert(table[9] == true);
assert(table[12] == true);
}
525513 (ワッチョイ 3602-WJTY)
2022/12/04(日) 19:19:16.77ID:flilPTWf0526デフォルトの名無しさん (アウアウウー Sab5-VKAQ)
2022/12/04(日) 19:57:57.00ID:/CRfCGQ0a 定数でいいならマクロでやるとか
#include <cstdio>
#define _(i) (1 << i)
int main() {
int b = _(8) | _(9) | _(12);
for (int i = 0; i <= 12; i++) {
printf("%d:%d\n", i, (b >> i) & 1);
}
return 0;
}
#include <cstdio>
#define _(i) (1 << i)
int main() {
int b = _(8) | _(9) | _(12);
for (int i = 0; i <= 12; i++) {
printf("%d:%d\n", i, (b >> i) & 1);
}
return 0;
}
527はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/04(日) 20:05:21.16ID:YO7rrhiC0528デフォルトの名無しさん (アウアウウー Sab5-VKAQ)
2022/12/04(日) 20:59:12.00ID:/CRfCGQ0a 訂正
#define _(i) (1 << i)
より
#define _(i) (1 << (i))
のほうが安心
#define _(i) (1 << i)
より
#define _(i) (1 << (i))
のほうが安心
529513 (ワッチョイ 3602-WJTY)
2022/12/04(日) 23:12:00.77ID:flilPTWf0 これまでビット演算を意識したことがなかったので考え方を知れて助かります
提示いただいた例から自分でも調査が進められそうでなんとかなりそうです
いろいろありがとうございました
提示いただいた例から自分でも調査が進められそうでなんとかなりそうです
いろいろありがとうございました
530デフォルトの名無しさん (オイコラミネオ MM71-NwO+)
2022/12/05(月) 01:35:26.13ID:gMitSG4kM531デフォルトの名無しさん (ブーイモ MMba-mM0k)
2022/12/05(月) 10:23:03.76ID:DqBKeem4M 一々メモリアクセスが発生して直感的には遅そうだけど
532デフォルトの名無しさん (ササクッテロラ Sp10-cIXn)
2022/12/05(月) 10:35:35.88ID:hYIKK9DOp オプティマイズされるからなぁ
記述だけで速度なんか分からないよ
記述だけで速度なんか分からないよ
533デフォルトの名無しさん (ワッチョイ aa01-QZbE)
2022/12/05(月) 11:26:10.51ID:9YGPhFSH0534デフォルトの名無しさん (ワッチョイ eead-NN2n)
2022/12/05(月) 12:04:38.42ID:AHxKL62Z0 俺なら3クロックでイッちゃうけどね
535デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/05(月) 13:51:14.89ID:0xhTnbB50536デフォルトの名無しさん (ササクッテロラ Sp10-cIXn)
2022/12/05(月) 13:53:40.80ID:iLlZW1brp 速度重視ならアセンブラ…
いや、何でも無い
いや、何でも無い
537デフォルトの名無しさん (ワッチョイ b069-Znoa)
2022/12/05(月) 14:04:07.58ID:0Re98eJO0 (Cだけど)昔は isalpha や is~ 系のやつはテーブル参照で実装してたのがあった
538はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/05(月) 14:25:03.89ID:6Xcp09rU0 集合を扱うには std::set を使うのが楽だと思う。
集合を集合っぽく扱える機能は一通りそろってるからたぶん集合型というものに期待していることはだいたい含まれるよ。
Pascal の集合型のことはよう知らんけど。
(一般的に) std::set は二分木で実装されるという都合上、やりたいことによっては性能 (速度) 上の不満が生じることもあるかもしれないけど、
具体的な問題が出る前に先回りして考えてもだいたい徒労だしな。
>>537
実行時にロケールを切り替える必要性からじゃない?
集合を集合っぽく扱える機能は一通りそろってるからたぶん集合型というものに期待していることはだいたい含まれるよ。
Pascal の集合型のことはよう知らんけど。
(一般的に) std::set は二分木で実装されるという都合上、やりたいことによっては性能 (速度) 上の不満が生じることもあるかもしれないけど、
具体的な問題が出る前に先回りして考えてもだいたい徒労だしな。
>>537
実行時にロケールを切り替える必要性からじゃない?
539デフォルトの名無しさん (ワッチョイ aa01-QZbE)
2022/12/05(月) 14:43:13.12ID:9YGPhFSH0540デフォルトの名無しさん (スップ Sd9e-HF5l)
2022/12/05(月) 14:45:20.89ID:oclBynCfd541513 (ワッチョイ 3602-g9pY)
2022/12/05(月) 15:16:20.05ID:jV16hsjJ0 0〜255を格納する方は定数でしか使わないので>>518のやり方にしました
0〜31くらいまでしか使わない方は、変数に格納された任意の値の集合を
そのまま引数に渡したり、積集合や差集合を求めるのを想定しています
確かにstd::setがその用途ですね
速度が遅そうで敬遠していましたが、実際にはこれがボトルネックになることはないと思います
initializer_listと合わせれば、ほぼPascalと同じ使用感でいけるので、ビット演算のテクニックは
引き続き研究しつつ、いったんstd::setで実装しようと思います
0〜31くらいまでしか使わない方は、変数に格納された任意の値の集合を
そのまま引数に渡したり、積集合や差集合を求めるのを想定しています
確かにstd::setがその用途ですね
速度が遅そうで敬遠していましたが、実際にはこれがボトルネックになることはないと思います
initializer_listと合わせれば、ほぼPascalと同じ使用感でいけるので、ビット演算のテクニックは
引き続き研究しつつ、いったんstd::setで実装しようと思います
542デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/05(月) 15:31:21.47ID:0xhTnbB50 >>540
constexprも絡むね
constexprも絡むね
543530 (オイコラミネオ MM71-NwO+)
2022/12/05(月) 17:26:36.58ID:rfCFGpMmM >>540
キャッシュの話になると本当の速さがなかなか分からなくなってくる。
(CPUアーキテクチャやその他の処理の仕方に依存してしまうし。)
キャッシュがある CPU において、キャッシュミスが発生した場合は、
>>526の方が速いであろうと予測はされる。
そもそも、キャッシュの働きが弱いラズパイPICO、Arduino、ESP32 などでは
恐らく>>518 の方が速い。
そもそもシフト演算がシフト量に比例して遅くなるマイコンもあるだろうし。
Z80や8086はそうだった。
x86、x64の場合、
この関数を使うループの中で、他の目的のためにメモリーを大規模に使った場合は、
>>526の方が速いが、沢山メモリーを使わなかった場合は、>>518の方が速い。
キャッシュの話になると本当の速さがなかなか分からなくなってくる。
(CPUアーキテクチャやその他の処理の仕方に依存してしまうし。)
キャッシュがある CPU において、キャッシュミスが発生した場合は、
>>526の方が速いであろうと予測はされる。
そもそも、キャッシュの働きが弱いラズパイPICO、Arduino、ESP32 などでは
恐らく>>518 の方が速い。
そもそもシフト演算がシフト量に比例して遅くなるマイコンもあるだろうし。
Z80や8086はそうだった。
x86、x64の場合、
この関数を使うループの中で、他の目的のためにメモリーを大規模に使った場合は、
>>526の方が速いが、沢山メモリーを使わなかった場合は、>>518の方が速い。
544513 (ワッチョイ 3602-g9pY)
2022/12/05(月) 17:29:22.78ID:jV16hsjJ0545はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/05(月) 18:42:52.30ID:6Xcp09rU0 >>544
イテレータを受け渡すのがめんどいな。
そのへんは適当なラッパー関数 (または演算子オーバーロード) を定義すればいいんでないの。
たぶんこんな感じにしたいのかな?
https://wandbox.org/permlink/kpYoEhyGaykqITEG
イテレータを受け渡すのがめんどいな。
そのへんは適当なラッパー関数 (または演算子オーバーロード) を定義すればいいんでないの。
たぶんこんな感じにしたいのかな?
https://wandbox.org/permlink/kpYoEhyGaykqITEG
546デフォルトの名無しさん (ワッチョイ 915f-7kHv)
2022/12/05(月) 18:43:23.85ID:k8gztHb50547デフォルトの名無しさん (ワッチョイ 915f-7kHv)
2022/12/05(月) 18:56:45.80ID:k8gztHb50 >>545 なるほどめんどくさいな。
よく考えたら contains すら C++20 からっていうのもひどい話よな。
よく考えたら contains すら C++20 からっていうのもひどい話よな。
548デフォルトの名無しさん (アウアウウー Sab5-+hgW)
2022/12/05(月) 20:18:26.80ID:Rd1Rhxq6a 江添が女性支援に批判的で笑ったわ
549513 (ワッチョイ 3602-Ly+b)
2022/12/05(月) 20:57:35.77ID:jV16hsjJ0 >>545
ありがとうございます
いろいろ知識や考えが足りませんでした
おかげ様で理想形に近づけることができました
std::set<T> operator*(const std::set<T>& x, std::initializer_list<T> init)
foo * _(1, 3, 5)
https://wandbox.org/permlink/14GBm1DqQ6iUaRPq
ありがとうございます
いろいろ知識や考えが足りませんでした
おかげ様で理想形に近づけることができました
std::set<T> operator*(const std::set<T>& x, std::initializer_list<T> init)
foo * _(1, 3, 5)
https://wandbox.org/permlink/14GBm1DqQ6iUaRPq
550デフォルトの名無しさん (オッペケ Sr10-4Nt7)
2022/12/06(火) 09:26:29.57ID:S4cyJC5Ur >>548
ツイフェミに批判的なだけだったわ
ツイフェミに批判的なだけだったわ
551デフォルトの名無しさん (アウアウウー Sa08-+hgW)
2022/12/06(火) 09:51:28.64ID:mFLMdD4Ga まあ、「ザ・男」ってタイプだからな
ケチがディテールにこだわるのもありがち
ケチがディテールにこだわるのもありがち
552デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/06(火) 11:12:56.86ID:63yxghiR0 今や絶滅危惧種となったテキトーこくの嫌いな人
553デフォルトの名無しさん (ワッチョイ ce01-Znoa)
2022/12/06(火) 13:12:15.09ID:9i6eYS/u0 そういう人ここは比較的多いでしょ?
554デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/06(火) 13:47:59.27ID:63yxghiR0 配列がハッシュだなんて裏も取らずに信じちまうやつもか?
555デフォルトの名無しさん (アウアウウー Sa08-+hgW)
2022/12/06(火) 14:38:33.85ID:mFLMdD4Ga テーブルのアクセスに使う添字はインデックス?キー?
556デフォルトの名無しさん (スッップ Sd70-AXrT)
2022/12/06(火) 14:47:42.28ID:iX2JPZR5d サブスクリプト
557デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/06(火) 15:21:19.75ID:RihiShBFa >>554
まだいたのかよ、よほど悔しかったんだなw
まだいたのかよ、よほど悔しかったんだなw
558デフォルトの名無しさん (スッップ Sd70-AXrT)
2022/12/06(火) 15:50:10.05ID:iX2JPZR5d 信じてたやつが返事してるな
今度こそ別人ではあるまい
今度こそ別人ではあるまい
559デフォルトの名無しさん (スッップ Sd70-AXrT)
2022/12/06(火) 15:56:04.19ID:iX2JPZR5d HDDを指さしてメモリと言ってたやつのほうがまだマシ
記憶装置という点でそんなに大外れではないからな
配列を指さしてハッシュと言うやつは
アメリカザリガニを指さして飛行機と言うようなもんで
どうやっても擁護不可能
記憶装置という点でそんなに大外れではないからな
配列を指さしてハッシュと言うやつは
アメリカザリガニを指さして飛行機と言うようなもんで
どうやっても擁護不可能
560デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/06(火) 16:49:16.67ID:RihiShBFa >>496 にレスできないクズ乙w
561デフォルトの名無しさん (スッップ Sd94-bEFD)
2022/12/06(火) 17:07:58.34ID:uWr4N4pQd 美味しいという共通点くらいしか
562デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/06(火) 18:13:06.65ID:63yxghiR0 ここは技術板
配列とハッシュを混同すること以上の恥もクズも存在し得ない
配列とハッシュを混同すること以上の恥もクズも存在し得ない
563デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/06(火) 18:23:59.19ID:qiG38keca 本人謝ってるのにしつこく絡むのは技術云々の前に人としてどうなの?
564デフォルトの名無しさん (ワッチョイ 30ad-4FAg)
2022/12/06(火) 18:57:26.14ID:6Wvozz0/0 だれも謝罪してないし、配列もメモリマネージャーからみればハッシュだし
565デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/06(火) 19:27:21.71ID:qiG38keca566デフォルトの名無しさん (ワッチョイ 30ad-4FAg)
2022/12/06(火) 19:41:58.07ID:6Wvozz0/0 EASTLは、unordered_mapに相当するクラスを独自実装しhash_mapと呼んできた経緯がある
Perlの専門用語が他言語に持ち込まれた分りやすい例といえるだろう
Perlの専門用語が他言語に持ち込まれた分りやすい例といえるだろう
567デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/06(火) 21:47:51.22ID:63yxghiR0 >>565
何? 謝罪したらこんなに恥をかかずに済んだってとこに、まだすがりたいの?
そりゃそうだろうね、技術板で最大の恥をさらしたんだからwww
おまえ悪態つきすぎたんだよ、こっちも悪意に満ちた対応するからな
もう覚悟するしかねえんだよ、おまえw
何? 謝罪したらこんなに恥をかかずに済んだってとこに、まだすがりたいの?
そりゃそうだろうね、技術板で最大の恥をさらしたんだからwww
おまえ悪態つきすぎたんだよ、こっちも悪意に満ちた対応するからな
もう覚悟するしかねえんだよ、おまえw
568デフォルトの名無しさん (ササクッテロラ Sp5f-w5YM)
2022/12/06(火) 21:59:01.18ID:Pw6mR/Vsp 粘着恥ずかしいw
569デフォルトの名無しさん (ワッチョイ c001-g9pY)
2022/12/06(火) 22:07:01.02ID:iea0dAEs0 C++使いは、その程度のことで粘着しない。
なぜなら、C++使いは爺だから。
なぜなら、C++使いは爺だから。
570デフォルトの名無しさん (ワッチョイ ecda-/mMf)
2022/12/06(火) 22:59:17.33ID:wE68yyZV0 >>519
あんま細かいこと拘るとハゲるからな
あんま細かいこと拘るとハゲるからな
571デフォルトの名無しさん (ワッチョイ ecda-/mMf)
2022/12/06(火) 23:00:17.17ID:wE68yyZV0 レス誤爆メンゴ
572デフォルトの名無しさん (オッペケ Sr5f-3U9L)
2022/12/06(火) 23:03:05.74ID:id7qJpRpr 爺こそ粘着するのでは?
暇だから
暇だから
573デフォルトの名無しさん (ワッチョイ c001-g9pY)
2022/12/06(火) 23:07:03.02ID:iea0dAEs0 インテリ爺は粘着される方だろ。
574デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/07(水) 06:03:51.56ID:BYUaD+1v0 unordered_mapはハッシュを使うというだけで、それ自体がハッシュだという主張は誤り
好意的に解釈してもデータメンバと継承を混同するようなもの
好意的に解釈してもデータメンバと継承を混同するようなもの
575デフォルトの名無しさん (スッップ Sd94-bEFD)
2022/12/07(水) 07:45:49.40ID:mMrpdU8md >>571
メンゴって…
メンゴって…
576デフォルトの名無しさん (スッップ Sd70-YdaX)
2022/12/07(水) 11:52:13.93ID:adYZ5td8d まだハッシュ言ってるのか
Parl界隈で使ってる言い回しなんだねこのスレで使うなら合ってなかったねで終わる話やろ
Parl界隈で使ってる言い回しなんだねこのスレで使うなら合ってなかったねで終わる話やろ
577デフォルトの名無しさん (ワッチョイ ce01-Znoa)
2022/12/07(水) 11:59:24.24ID:O14sy2T20578デフォルトの名無しさん (スププ Sd70-sdih)
2022/12/07(水) 13:47:36.67ID:e45EJ0mMd 粘着自体は無視スルーすれば良いからどうでもいいわ
それより将来鯖ログ開示されたとき
誰と誰が自演だったかの答え合わせはしてみたい
それより将来鯖ログ開示されたとき
誰と誰が自演だったかの答え合わせはしてみたい
579デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/07(水) 14:06:40.54ID:BYUaD+1v0580デフォルトの名無しさん (ワッチョイ ce01-Znoa)
2022/12/07(水) 14:09:36.34ID:O14sy2T20 病的だな
581デフォルトの名無しさん (アウアウウー Sa08-OZMj)
2022/12/07(水) 14:42:14.43ID:FsTyICUTa 誰も興味ないわ
582デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/07(水) 15:26:40.34ID:Xzjw4n/la >>576
> Parl界隈で使ってる言い回しなんだねこのスレで使うなら合ってなかったねで終わる話やろ
それを言ってるならまだ分からないでもないけど 配列 ≠ ハッシュ なんて本人謝ってるのにしつこく絡み続けてる
そんなことでしかマウント取れないんだろうけどマジでなんかの病気だと思うわ
> Parl界隈で使ってる言い回しなんだねこのスレで使うなら合ってなかったねで終わる話やろ
それを言ってるならまだ分からないでもないけど 配列 ≠ ハッシュ なんて本人謝ってるのにしつこく絡み続けてる
そんなことでしかマウント取れないんだろうけどマジでなんかの病気だと思うわ
583デフォルトの名無しさん (アウアウウー Sa08-g9pY)
2022/12/07(水) 15:34:18.88ID:4LPWB+Rga ハゲの上塗り
584デフォルトの名無しさん (ササクッテロラ Sp5f-w5YM)
2022/12/07(水) 15:34:20.23ID:HdWAA0Dip いいから相手にしない
もう飽きたよ
もう飽きたよ
585デフォルトの名無しさん (スッップ Sd70-YdaX)
2022/12/07(水) 15:42:19.49ID:adYZ5td8d586デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/07(水) 17:13:38.78ID:BYUaD+1v0 謝るのに>>313のような態度で許されるとでも思っているのか
587デフォルトの名無しさん (ワッチョイ e75f-UplN)
2022/12/07(水) 19:28:34.64ID:cizNPWpb0 まーだやってるw
588デフォルトの名無しさん (エムゾネ FF70-NMmp)
2022/12/07(水) 20:15:26.67ID:X5O9NNHYF 病気だよ
589デフォルトの名無しさん (ワッチョイ aa01-QZbE)
2022/12/07(水) 20:48:27.45ID:0xPH+d9p0 そもそも >>313 は Perl での呼び方の話で 配列 ≠ ハッシュ の話じゃないから謝罪なんてしてない
わざとなのか混乱してるのか知らんけど病的なのは間違いない
わざとなのか混乱してるのか知らんけど病的なのは間違いない
590デフォルトの名無しさん (ワッチョイ 0acf-L4s+)
2022/12/08(木) 08:19:28.46ID:/GcWMRnI0 >>576
そこにPerl界隈でも使ってないとか言う奴が現れて無駄に反論を呼んだ。
そこにPerl界隈でも使ってないとか言う奴が現れて無駄に反論を呼んだ。
591デフォルトの名無しさん (ワッチョイ 30ad-4FAg)
2022/12/08(木) 08:34:20.66ID:d3Fi/Jhx0 今日はParl Harbor攻撃から81年目に当たるらしい
592デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/08(木) 10:11:41.48ID:JnPWza2ja >>590
とりあえずそれはなんとか収まったけどその後 配列 ≠ ハッシュ 君が粘着しだした
とりあえずそれはなんとか収まったけどその後 配列 ≠ ハッシュ 君が粘着しだした
593デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/08(木) 10:26:23.30ID:7N/fyoNc0 煽り耐性なさすぎなハッシュ君
ちょっとカマかけると元気にお返事しやがんのw
終わりにしたいなら反応しなきゃいいのに
わざわざ出てくるマゾ野郎w
ちょっとカマかけると元気にお返事しやがんのw
終わりにしたいなら反応しなきゃいいのに
わざわざ出てくるマゾ野郎w
594デフォルトの名無しさん (テテンテンテン MM34-QZbE)
2022/12/08(木) 12:19:06.63ID:qJNUqX4GM ハッシュの話をするやつはコテハン付けろ。NGするから。
コテハン無しでハッシュを話題にするのは禁止な。
コテハン無しでハッシュを話題にするのは禁止な。
595デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/08(木) 12:45:20.88ID:JnPWza2ja カマなんてかけてもないのに頓珍漢レスしてるキチに言われてもねw
596デフォルトの名無しさん (ワッチョイ 9fc2-He5u)
2022/12/08(木) 13:41:50.14ID:7N/fyoNc0 反応してる時点でおまえ悔しさがにじみ出てるからw
こっちは誰が何と言おうと絶対に揺るがない基礎理論に基づいているから安心してアホにできてオモロイだけ
こっちは誰が何と言おうと絶対に揺るがない基礎理論に基づいているから安心してアホにできてオモロイだけ
597デフォルトの名無しさん (ワッチョイ 30ad-4FAg)
2022/12/08(木) 14:56:30.96ID:d3Fi/Jhx0 「C++」が「Java」を抜いて3位に--12月のTIOBEプログラミング言語ランキング - ZDNet Japan
https://japan.zdnet.com/article/35197053/
Liam Tung (Special to ZDNet.com) 翻訳校正: 編集部 2022-12-07 11:32
https://japan.zdnet.com/article/35197053/
Liam Tung (Special to ZDNet.com) 翻訳校正: 編集部 2022-12-07 11:32
598デフォルトの名無しさん (ワッチョイ 721f-a1Dg)
2022/12/08(木) 15:02:28.31ID:/H4Yp5E/0 今更流行る理由があるのか
AI?
AI?
599デフォルトの名無しさん (ワッチョイ df24-Ah0T)
2022/12/08(木) 16:44:45.46ID:iuNweycO0 多次元配列クラスのSTL入りもまだなのにAIwwwwwwwwwwwww
600デフォルトの名無しさん (ワッチョイ d8cf-R4o2)
2022/12/08(木) 16:45:49.30ID:MKGRO6qH0 >C++の人気が高まる一方で、Javaの人気は低下している
601デフォルトの名無しさん (ササクッテロラ Spd7-w5YM)
2022/12/08(木) 18:04:41.79ID:F9H67G14p 今更メモリー管理したくないよぉ
602デフォルトの名無しさん (ワッチョイ 849c-QZbE)
2022/12/08(木) 18:10:36.30ID:z+sTXcJV0603はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9e3e-7kHv)
2022/12/08(木) 18:26:03.92ID:FVxzWUbn0 >>601
したくないけどする必要があるときには C++ くらいの機構があるとやりやすいんじゃろ。 知らんけど。
したくないけどする必要があるときには C++ くらいの機構があるとやりやすいんじゃろ。 知らんけど。
604デフォルトの名無しさん (ワッチョイ 3ff0-HF5l)
2022/12/08(木) 18:33:45.11ID:lUjyKwZV0 デストラクタが無い言語とか論外じゃね?
605デフォルトの名無しさん (アウアウウー Sab5-QZbE)
2022/12/08(木) 19:14:03.24ID:ZTTdli19a 基礎理論w
606デフォルトの名無しさん (ワッチョイ c001-g9pY)
2022/12/08(木) 19:42:03.83ID:pXyaJjcm0 欧米の知的な人たちの間でC++が流行ってるんだろ。
607デフォルトの名無しさん (アウアウウー Sa08-+hgW)
2022/12/08(木) 19:43:41.79ID:pfHF/B3ga したくないというポイントはだいたい稼げるところだな
608デフォルトの名無しさん (ワッチョイ ecda-/mMf)
2022/12/08(木) 20:48:03.13ID:+R/2mzDC0 インテリ
ジェンス
ジェンス
609デフォルトの名無しさん (アウアウウー Sa6b-USyc)
2022/12/10(土) 04:54:52.93ID:NVs+qJ8Ua まぁゲーム開発はいつまでもC++だからなぁ。ついでC#
610デフォルトの名無しさん (ワッチョイ e701-wOZi)
2022/12/10(土) 12:17:36.89ID:c/3U+eWJ0 UIはその時の流行りの言語で書くけど戦術ロジックだけは絶対にC++で書きたい
611デフォルトの名無しさん (ササクッテロラ Sp1b-Xf+d)
2022/12/10(土) 12:26:15.44ID:z6yEzr6lp C#って、むしろ大規模になって来ると意味不明なエラーが出て破綻しないか?
612デフォルトの名無しさん (ブーイモ MM8b-CGXW)
2022/12/10(土) 14:59:01.80ID:mMjCV03FM C#が悪いわけではないけど、メモリー解放とかルーズにしたままある程度コード書けちゃうからね、、、
大規模になってくると無頓着だったメモリー解放が火を吹く感じはある
C++はそんなルーズな書き方してたらすぐ破綻するから、そういうコードは多くないけど初期の実装には多くの時間がかかる感じ
大規模になってくると無頓着だったメモリー解放が火を吹く感じはある
C++はそんなルーズな書き方してたらすぐ破綻するから、そういうコードは多くないけど初期の実装には多くの時間がかかる感じ
613デフォルトの名無しさん (アウアウウー Sa6b-SJNI)
2022/12/10(土) 15:38:10.95ID:Sts37KEXa c#のプロジェクトはなんか疎結合になっとらんこと多いわ
614はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-3TNT)
2022/12/10(土) 17:52:23.34ID:brInbnm70 プロジェクトを分割しようとしてもどうにも分離しきれない絡み合った部分ってあると思うんよ。
そういうときは機能別に分割するというだけではなく絡み合った部分は絡み合ったものとしてレイヤとして切り分けると上手くいく。
面倒くさいところは一か所に押し込めて横に切る感じ。
C# のプロジェクトはレイヤで分ける意識が希薄で縦割りばかりするので分離しきれない結合が全体にうっすらと残ってる感じ。
密結合というほどではないけど全体にうっすらなので、面倒くさい箇所が一か所にまとまってるよりしんどい。
というのが私の印象。 C# のことはあんまり知らんけど。
そういうときは機能別に分割するというだけではなく絡み合った部分は絡み合ったものとしてレイヤとして切り分けると上手くいく。
面倒くさいところは一か所に押し込めて横に切る感じ。
C# のプロジェクトはレイヤで分ける意識が希薄で縦割りばかりするので分離しきれない結合が全体にうっすらと残ってる感じ。
密結合というほどではないけど全体にうっすらなので、面倒くさい箇所が一か所にまとまってるよりしんどい。
というのが私の印象。 C# のことはあんまり知らんけど。
615デフォルトの名無しさん (オイコラミネオ MM7b-GD9R)
2022/12/10(土) 18:06:38.22ID:7p0k8251M616デフォルトの名無しさん (ワッチョイ 675f-k8RX)
2022/12/10(土) 20:25:28.70ID:PM5iwksI0 DのUpdateみると1000ms待たないと終わらないように見えるけどそれはいいの?
617ハノン ◆QZaw55cn4c (US 0H9b-JdnI)
2022/12/10(土) 20:33:03.87ID:6SBPs3AFH >>614
トップダウン、ボトムアップ、両面から書いていったとき、それが出会うところでグダグダなその場しのぎのコードに書かざるを得ない経験はありますね
トップダウン、ボトムアップ、両面から書いていったとき、それが出会うところでグダグダなその場しのぎのコードに書かざるを得ない経験はありますね
618デフォルトの名無しさん (ブーイモ MMcf-ejuF)
2022/12/10(土) 20:33:20.22ID:MWcOm8HwM #include <iostream>
int main() {
const int i = 1;
++*const_cast<int*>(&i);
std::cout << i;
}
何が表示されると思う?
違法?合法?
https://wandbox.org/permlink/57h9V6JX7fJes663
int main() {
const int i = 1;
++*const_cast<int*>(&i);
std::cout << i;
}
何が表示されると思う?
違法?合法?
https://wandbox.org/permlink/57h9V6JX7fJes663
619デフォルトの名無しさん (ワッチョイ 4732-ptKG)
2022/12/10(土) 20:55:46.09ID:G20+9FPP0 >>618
const なオブジェクトに書き込むのは許されない (未定義) が型の上で const を外すだけならアリ。 つまり ++ を除けば合法だが ++ のせいで違法。
const なオブジェクトに書き込むのは許されない (未定義) が型の上で const を外すだけならアリ。 つまり ++ を除けば合法だが ++ のせいで違法。
620デフォルトの名無しさん (アウアウウー Sa6b-k8RX)
2022/12/10(土) 21:19:19.36ID:+Ttg8yU5a int main() {
const int i = 1;
int*j =const_cast<int*>(&i);
*j=2;
std::cout << &i<<" "<< j<<std::endl;
std::cout<<i <<" "<< *j;
}
https://wandbox.org/permlink/DC1E3ycea3UtdBAI
0x7ffc53e76e1c 0x7ffc53e76e1c
1 2
上のやつちょっといじってみた
アドレスの値同じなのに値違うんだけどなんでなんだろ
const int i = 1;
int*j =const_cast<int*>(&i);
*j=2;
std::cout << &i<<" "<< j<<std::endl;
std::cout<<i <<" "<< *j;
}
https://wandbox.org/permlink/DC1E3ycea3UtdBAI
0x7ffc53e76e1c 0x7ffc53e76e1c
1 2
上のやつちょっといじってみた
アドレスの値同じなのに値違うんだけどなんでなんだろ
621デフォルトの名無しさん (ワッチョイ 477c-eoXr)
2022/12/10(土) 21:23:07.71ID:QKVQj6nE0 そりゃ未定義動作だもの
鼻から悪魔が出なかっただけありがたいと思え
鼻から悪魔が出なかっただけありがたいと思え
622デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/10(土) 21:57:24.92ID:lr6mtoK80 その処理系ではconst_castはコンパイラをごまかす宣言ではなく&iというオブジェクトを作ってるんだろう
623デフォルトの名無しさん (ワッチョイ a769-3TNT)
2022/12/10(土) 22:07:20.11ID:qktiUlCS0 コンパイル時にiが1に置き換えられてるだけだろう
624デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/10(土) 22:23:55.76ID:lr6mtoK80 それだけじゃ&iの動作について言及が足りない感じ
625デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/10(土) 22:36:19.38ID:HtRCvZl/0 多分
const int i = 1;
を受けた最適化の結果、
std::cout<<i
が
std::cout<<1
という意味のコードになったとかじゃないの
逆アセして調べると良い
const int i = 1;
を受けた最適化の結果、
std::cout<<i
が
std::cout<<1
という意味のコードになったとかじゃないの
逆アセして調べると良い
626デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/10(土) 22:38:11.75ID:HtRCvZl/0 あるいは真にiの値を見たいのなら
...(前半は同じ)...
auto *p = (volatile int*)&i;
cout << i << " " << j << endl;
みたいにするとか?
※ 個人の感想です
...(前半は同じ)...
auto *p = (volatile int*)&i;
cout << i << " " << j << endl;
みたいにするとか?
※ 個人の感想です
627デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/10(土) 22:38:50.72ID:HtRCvZl/0 まつがえたorz
あるいは真にiの値を見たいのなら
...(前半は同じ)...
auto *p = (volatile int*)&i;
cout << *p << " " << j << endl;
みたいにするとか?
※ 個人の感想です
あるいは真にiの値を見たいのなら
...(前半は同じ)...
auto *p = (volatile int*)&i;
cout << *p << " " << j << endl;
みたいにするとか?
※ 個人の感想です
628デフォルトの名無しさん (ワッチョイ 477c-eoXr)
2022/12/10(土) 23:00:40.51ID:QKVQj6nE0 未定義動作をどうしようとコンパイラの自由なんだからそんなもの調べたってしょうがない
ちゃんと書けばいいだけのこと
ちゃんと書けばいいだけのこと
629デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/10(土) 23:01:50.82ID:lr6mtoK80 既に
std::cout << &i<<" "<< j<<std::endl;
により&iとjが同じ値であることは示されてる
auto *p = (volatile int*)&i;
これでも同じアドレスとして解釈されている(試した)
きっとconst_castに限らずconst領域のアドレスを解釈する時点で
ここのコンパイラは別領域を確保するんだな
std::cout << &i<<" "<< j<<std::endl;
により&iとjが同じ値であることは示されてる
auto *p = (volatile int*)&i;
これでも同じアドレスとして解釈されている(試した)
きっとconst_castに限らずconst領域のアドレスを解釈する時点で
ここのコンパイラは別領域を確保するんだな
630デフォルトの名無しさん (ワッチョイ 477c-eoXr)
2022/12/10(土) 23:07:18.20ID:QKVQj6nE0 そのcoutに出してるコードも含めて未定義動作なんだから出力されるゴミ文字列には何の保証も意味もないぞ
だからちゃんとやれ
だからちゃんとやれ
631デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/10(土) 23:07:19.81ID:HtRCvZl/0632デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/10(土) 23:34:26.52ID:lr6mtoK80633デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/11(日) 00:20:42.40ID:Pzj62nR+0634デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/11(日) 00:25:27.26ID:Wb0o85TW0635デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/11(日) 00:29:21.03ID:Wb0o85TW0 あーごめん>>634は取り消し
636デフォルトの名無しさん (ブーイモ MMcf-ejuF)
2022/12/11(日) 16:42:27.87ID:le6rXKgRM 未定義動作ではいおしまいは思考停止では?
コンパイラの実装を考えてみるのも面白い
コンパイラの実装を考えてみるのも面白い
637デフォルトの名無しさん (ワッチョイ 477c-eoXr)
2022/12/11(日) 17:18:36.24ID:SgVyrwp80 ゴミ捨て場の汚物の配置を面白がる趣味もいいけどそれで宇宙の真理を読み取ったとか言い出されても困るんだわ
638デフォルトの名無しさん (ワッチョイ df01-0RkQ)
2022/12/11(日) 17:28:44.13ID:B9k8N7vL0 特定のコンパイラの挙動が知りたいなら逆アセしろ
仕様が知りたいなら未定義動作
と言うだけの事だろ
仕様が知りたいなら未定義動作
と言うだけの事だろ
639デフォルトの名無しさん (ワッチョイ a701-3npV)
2022/12/11(日) 19:27:20.67ID:vt5XMNwC0 未定義踏んで、たまたま望む動作だった場合に、それを放置するのは危険すぎる
640はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-3TNT)
2022/12/11(日) 19:44:01.28ID:ftKoc+Hh0 前後の状況との組み合わせでも結果が変わったりするから短いコードで試しても
そのコンパイラでの挙動を知れたとは言えんし……。
そのコンパイラでの挙動を知れたとは言えんし……。
641デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/12(月) 02:44:59.90ID:m98xyCFn0642デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 14:55:49.27ID:P0mM9QsZM vector<string> v; の vを辞書順でソートした場合、string自体はメモリ上に
連続して並ぶが、肝心の文字列バッファは free store 上でバラバラに離れた
位置になるからキャッシュ・ミスし易くなるね。
stroustrup氏はリンクリストがキャッシュミスし易いと言って馬鹿にしていたが、
実際には動的配列(vector)でも大差は無い。
なお、リンクリストでキャッシュミスし易い典型例がソート後の全巡回ループ。
そしてその場合、vectorでもstringのようなメモリ資源ハンドルの場合は
キャッシュミスが免れない。
連続して並ぶが、肝心の文字列バッファは free store 上でバラバラに離れた
位置になるからキャッシュ・ミスし易くなるね。
stroustrup氏はリンクリストがキャッシュミスし易いと言って馬鹿にしていたが、
実際には動的配列(vector)でも大差は無い。
なお、リンクリストでキャッシュミスし易い典型例がソート後の全巡回ループ。
そしてその場合、vectorでもstringのようなメモリ資源ハンドルの場合は
キャッシュミスが免れない。
643デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:09:17.26ID:P0mM9QsZM >>642
[補足]
そもそも、C++はcopyの代わりのmoveによる高速化を自慢しているが、
それが意味を持つのはstringのようにfree storeのメモリをポインタで持っている
ようなクラスである。
このご自慢のmoveが良く効くクラスTのvector<T>をソートした場合、
free storeの本当の中味のアドレスはソートされないまま。
なので、vectorを全巡回する時には、アドレスが飛びとびになり、キャッシュミス
が起き易い。
[補足]
そもそも、C++はcopyの代わりのmoveによる高速化を自慢しているが、
それが意味を持つのはstringのようにfree storeのメモリをポインタで持っている
ようなクラスである。
このご自慢のmoveが良く効くクラスTのvector<T>をソートした場合、
free storeの本当の中味のアドレスはソートされないまま。
なので、vectorを全巡回する時には、アドレスが飛びとびになり、キャッシュミス
が起き易い。
644デフォルトの名無しさん (ワッチョイ 675f-3TNT)
2022/12/12(月) 15:14:58.58ID:b4gQwKir0 >>642 うんうん。リンクリストにするとキャッスミスし易さがもう少し悪化するね。
645デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:21:22.44ID:P0mM9QsZM >>644
この例の場合、vectorをlistに変えてもあまり悪化しない。
なぜなら、stringとその文字列バッファが近接したアドレスのfree store
上にallocateされていると期待できるから。
この例の場合、vectorをlistに変えてもあまり悪化しない。
なぜなら、stringとその文字列バッファが近接したアドレスのfree store
上にallocateされていると期待できるから。
646デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:26:03.32ID:P0mM9QsZM >>645
[補足]
list<string> v2; の場合、push_back すると、
p1 = new string;
相当の事が実行されるが、p1 の内部の文字列バッファも、string のコンストラクタ
の中で
p2 = new char[N];
のようにして free store から確保される。
確率的には、p1 と p2 は非常に隣接したアドレスになっている可能性が非常に
高い。
その結果として、p1をアクセスした直後にp2にアクセスしてもキャッシュミスは起きない。
その結果、vector<string>とlist<string>のソート後の全巡回でのキャッシュミス回数は、
ほぼ同じ。
[補足]
list<string> v2; の場合、push_back すると、
p1 = new string;
相当の事が実行されるが、p1 の内部の文字列バッファも、string のコンストラクタ
の中で
p2 = new char[N];
のようにして free store から確保される。
確率的には、p1 と p2 は非常に隣接したアドレスになっている可能性が非常に
高い。
その結果として、p1をアクセスした直後にp2にアクセスしてもキャッシュミスは起きない。
その結果、vector<string>とlist<string>のソート後の全巡回でのキャッシュミス回数は、
ほぼ同じ。
647デフォルトの名無しさん (ワッチョイ 675f-3TNT)
2022/12/12(月) 15:33:08.04ID:b4gQwKir0648デフォルトの名無しさん (スップ Sd7f-fWbS)
2022/12/12(月) 15:34:37.69ID:s9w5HO4Md 典型的な用途ではsmall-string optimizationで大部分が連続になるでしょ
リンクリストにその恩恵はない
リンクリストにその恩恵はない
649デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:37:07.44ID:P0mM9QsZM650デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:39:41.84ID:P0mM9QsZM >>649
[補足]
vector<string>をソートすると、stringの「箱」が新しく確保されてしまうので、
中身だけがmoveされるので、stringと対応する文字列バッファは「離れ離れになる」
list<string>をソートすると、stringはアドレスは全く変化せず、string同士の
リンクのされ方だけが変化するだけだから、stringと対応する文字列バッファは、
メモリー空間上でのアドレスの隣接を維持する。
[補足]
vector<string>をソートすると、stringの「箱」が新しく確保されてしまうので、
中身だけがmoveされるので、stringと対応する文字列バッファは「離れ離れになる」
list<string>をソートすると、stringはアドレスは全く変化せず、string同士の
リンクのされ方だけが変化するだけだから、stringと対応する文字列バッファは、
メモリー空間上でのアドレスの隣接を維持する。
651デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:40:54.03ID:P0mM9QsZM652デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/12(月) 15:49:40.91ID:P0mM9QsZM >>650
[補足]
vector<string>のソート後の様子:
アドレス
0x0000: st100 ---> buf100 (st100とbuf100のアドレスは離れ離れ)
0x0010: st5 ---> buf5 (st5とbuf5のアドレスは離れ離れ)
st100とst5は隣接する。
ソート時に中身のアドレスだけがmove。
list<string>のソート後の様子:
st100 ---> buf100 (st100とbuf100は隣接したまま)
st5 ---> buf5 (st5とbuf5は隣接したまま)
st100とst5は隣接しない(但し、元のアドレスを維持したまま)。
ソート時には、一切のmoveもcopyも全く発生せず。
[補足]
vector<string>のソート後の様子:
アドレス
0x0000: st100 ---> buf100 (st100とbuf100のアドレスは離れ離れ)
0x0010: st5 ---> buf5 (st5とbuf5のアドレスは離れ離れ)
st100とst5は隣接する。
ソート時に中身のアドレスだけがmove。
list<string>のソート後の様子:
st100 ---> buf100 (st100とbuf100は隣接したまま)
st5 ---> buf5 (st5とbuf5は隣接したまま)
st100とst5は隣接しない(但し、元のアドレスを維持したまま)。
ソート時には、一切のmoveもcopyも全く発生せず。
653デフォルトの名無しさん (ワッチョイ a7e6-JdnI)
2022/12/12(月) 22:25:35.59ID:1Of7Vyge0 いちいちキャッシュのことまで考えて書いたことなんかないですねえ
654デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/12(月) 22:29:51.34ID:EC98/b6s0 天才ですから
655デフォルトの名無しさん (ワッチョイ 8710-bPD3)
2022/12/12(月) 22:53:10.09ID:m98xyCFn0 ソート済みならソートの利点を生かしたデータアクセスが主だろうからなあ
まあ最悪値を考えるかアベレージを考えるかはプログラム次第か
まあ最悪値を考えるかアベレージを考えるかはプログラム次第か
656デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/12(月) 23:33:02.97ID:OmhP4qQH0 キャッシュミスが起きるとか
キャッシュに収まりきらない要素数のリンクリストを
全要素まんべんなくアクセスし続ける場合とかの話であって
そうなれば区々たるデータ構造などあんま意味を成さなさげ
キャッシュに収まりきらない要素数のリンクリストを
全要素まんべんなくアクセスし続ける場合とかの話であって
そうなれば区々たるデータ構造などあんま意味を成さなさげ
657デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/13(火) 06:29:45.20ID:RVT68Vp10 >>656
だからお前のコードは遅いんだな
だからお前のコードは遅いんだな
658デフォルトの名無しさん (ワッチョイ dfad-KKgq)
2022/12/13(火) 07:27:28.93ID:XemHbbXi0 配列とハッシュの話を蒸し返すけど、キャッシュに退避したデータを取り出す仕組みはハッシュなので、配列も無意識・無自覚のハッシュといえる
659デフォルトの名無しさん (ワッチョイ 7fcf-FUlb)
2022/12/13(火) 07:49:45.53ID:HbzfEbfW0 トホホw
660デフォルトの名無しさん (スップ Sdff-C7Mp)
2022/12/13(火) 09:16:15.65ID:Dz/G0kAxd プログラムのフェッチもハッシュ、ライトもハッシュ、全てはハッシュに収束するのだ
661デフォルトの名無しさん (ワッチョイ dfad-KKgq)
2022/12/13(火) 09:37:04.67ID:XemHbbXi0 ありていにいえば、他のレイヤーのデータを参照する時にハッシュを使わないと処理速度が落ちてしまうので、いたるところに速度対策でハッシュ参照が実装されているってのがFA
662デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 09:54:38.28ID:6kCyUqZEd 仮にunordered_vectorなるものがあったにしても、それはハッシュではない
663デフォルトの名無しさん (スップ Sd7f-fWbS)
2022/12/13(火) 10:16:13.34ID:3/h11tyKd それunordered_setじゃね
664デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 10:32:20.10ID:nLXwCo+B0 vectorはそもそもunorderdだろ
setは同じ値を格納できないのだからvectorとは違う
setは同じ値を格納できないのだからvectorとは違う
665デフォルトの名無しさん (ブーイモ MMff-ejuF)
2022/12/13(火) 11:27:12.09ID:qMfL3xzXM 全文字列を結合したものを一括で確保して string_view を操作するのが1番パフォーマンス良さそう
666デフォルトの名無しさん (ワッチョイ dfad-KKgq)
2022/12/13(火) 11:41:42.04ID:XemHbbXi0667デフォルトの名無しさん (アウアウウー Sa6b-SJNI)
2022/12/13(火) 11:47:57.08ID:QcbajiAMa668デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/13(火) 12:02:52.82ID:RxDW3iqvd パフォーマンスを気にする人は何を使うんでしょうか
669デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 12:10:16.41ID:6kCyUqZEd670デフォルトの名無しさん (アウアウアー Sa4f-PRdN)
2022/12/13(火) 14:54:36.88ID:56FF6Qc2a >>669
え?w
え?w
671デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 16:20:37.61ID:6kCyUqZEd >>670
vectorがunorderedとが頭おかしいのかって
vectorがunorderedとが頭おかしいのかって
672デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/13(火) 16:36:06.63ID:RxDW3iqvd えっ???
673デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 16:50:01.90ID:nLXwCo+B0 >>669
c++のunorderd_は挿入時に挿入要素のキーによるソートが行われず要素の格納順が実装依存なコレクションに付けられている名称だから、vectorがunoreded_かどうかと言えばyesじゃない?
c++のunorderd_は挿入時に挿入要素のキーによるソートが行われず要素の格納順が実装依存なコレクションに付けられている名称だから、vectorがunoreded_かどうかと言えばyesじゃない?
674デフォルトの名無しさん (スップ Sdff-C7Mp)
2022/12/13(火) 16:51:40.89ID:Dz/G0kAxd vectorがorder性持ってたら逆に困る
675デフォルトの名無しさん (スップ Sdff-C7Mp)
2022/12/13(火) 17:09:14.84ID:Dz/G0kAxd intkeyのorderedmapってことか
676デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 17:26:33.26ID:nLXwCo+B0677デフォルトの名無しさん (ワッチョイ c75f-8x1f)
2022/12/13(火) 17:27:23.47ID:qOIMmk+U0 ランダムアクセスできるデータ構造でordered_だのunordered_だの定義してもこじつけでしかないし意味薄いんでは
678デフォルトの名無しさん (ワッチョイ 2724-xt4T)
2022/12/13(火) 18:15:32.74ID:afkUacc60 てす
679デフォルトの名無しさん (アウアウウー Sa6b-0RkQ)
2022/12/13(火) 18:20:36.37ID:7X0MJm0+a そんな事を言い出したらページアウトされてるデータの読出しになるかもしれないからディスクアクセスかもしれないだろ
680デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 18:25:37.11ID:6kCyUqZEd >>673
格納順を定義しろ
格納順を定義しろ
681デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 18:29:09.49ID:6kCyUqZEd ふざけたオレ定義はトコトン馬鹿にしてやんよ
682デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 18:32:26.52ID:nLXwCo+B0 >>680
iterator でたどれる順番
iterator でたどれる順番
683デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 18:35:45.77ID:nLXwCo+B0 >>680
ところでこの話の発端のhashでないunorderd vector ってどんなものをイメージしてたの?
ところでこの話の発端のhashでないunorderd vector ってどんなものをイメージしてたの?
684デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/13(火) 18:46:51.67ID:RVT68Vp10 >>681
まずはお前の定義を書け
まずはお前の定義を書け
685デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/13(火) 18:50:59.76ID:6kCyUqZEd >>682
今、屋台で酒飲んでるから後でな
今、屋台で酒飲んでるから後でな
686デフォルトの名無しさん (テテンテンテン MM8f-0RkQ)
2022/12/13(火) 18:55:09.41ID:c7PbDuSHM687デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/13(火) 19:04:10.54ID:nLXwCo+B0688デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/13(火) 19:20:14.84ID:RVT68Vp10 ordered_配列 ==> 勝手に中身がソートされる配列
が思い浮かぶ
が思い浮かぶ
689デフォルトの名無しさん (ブーイモ MM8f-5DNi)
2022/12/13(火) 19:23:38.37ID:LOsLj3+sM >>688
std::multiset なんてのがあるんだな
std::multiset なんてのがあるんだな
690デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/13(火) 19:24:14.15ID:jWNvO27sM そもそも、ordered かどうかは定義の問題。
まず、mapは、(key,value)を持っていて、keyで検索できる。setは、keyだけでvalueが無いが、
keyで検索できる。setは、mapでvalueをkeyにしたようなもの。だから、以下ではmapだけ
の話をする。
mapやunorderd_mapは、「検索」機能とbegin(),end() を利用した「巡回機能」の
両方を持っていて、巡回を key の大小関係順に巡れるかどうかで、
ordered かどうかが決まる。
バランス木(赤黒木など)を使う方が 接頭辞なしの map、ハッシュ法を使う方が
unorderd_map
前者の場合は、常に自動的に並び替えられた状態で格納される。
一方、そもそも vector は、好きな順序で入れられて決まったキーもなければ
自動的に並び替える機能も持ってないし、orderedかどうかを定義しても
特に意味が無い。そもそも、orderdのvectorが存在し無い。
また、故意に作ってもしょうがない。
まず、mapは、(key,value)を持っていて、keyで検索できる。setは、keyだけでvalueが無いが、
keyで検索できる。setは、mapでvalueをkeyにしたようなもの。だから、以下ではmapだけ
の話をする。
mapやunorderd_mapは、「検索」機能とbegin(),end() を利用した「巡回機能」の
両方を持っていて、巡回を key の大小関係順に巡れるかどうかで、
ordered かどうかが決まる。
バランス木(赤黒木など)を使う方が 接頭辞なしの map、ハッシュ法を使う方が
unorderd_map
前者の場合は、常に自動的に並び替えられた状態で格納される。
一方、そもそも vector は、好きな順序で入れられて決まったキーもなければ
自動的に並び替える機能も持ってないし、orderedかどうかを定義しても
特に意味が無い。そもそも、orderdのvectorが存在し無い。
また、故意に作ってもしょうがない。
691デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/13(火) 19:26:29.60ID:RVT68Vp10 ordered, unordered
が書けないヤツが多すぎ問題
が書けないヤツが多すぎ問題
692デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/13(火) 19:27:00.39ID:RVT68Vp10 実は全部同じ人?
693デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/13(火) 19:28:42.74ID:jWNvO27sM >>688
それが大体、「set」や「multiset」に相当する。
それが大体、「set」や「multiset」に相当する。
694デフォルトの名無しさん (ワッチョイ 675f-k8RX)
2022/12/13(火) 19:28:56.13ID:sAeHrnUZ0 巡回機能って何
695デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/13(火) 19:37:41.71ID:jWNvO27sM >>694
まだ使ったことが無いので書き方が間違ってるかも知れないが、
map<T,V> m;
に対して、
for ( auto &r : m ) {
cout << r.first << ":" << r.second << "\n";
}
で巡ることができる機能の事を言ったつもり。
for ( auto i = m.begin(); i != m.end(); ++i ) {
cout << m[i].first << ":" << m[i].second << "\n";
}
と等価だと思う。
ただし、一度も使ったことが無い。
まだ使ったことが無いので書き方が間違ってるかも知れないが、
map<T,V> m;
に対して、
for ( auto &r : m ) {
cout << r.first << ":" << r.second << "\n";
}
で巡ることができる機能の事を言ったつもり。
for ( auto i = m.begin(); i != m.end(); ++i ) {
cout << m[i].first << ":" << m[i].second << "\n";
}
と等価だと思う。
ただし、一度も使ったことが無い。
696デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/13(火) 20:16:44.72ID:RVT68Vp10697デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/13(火) 21:45:11.86ID:FUi24cxt0 keyとしてpointerを指定したmapがpointeeで正しくソートできるように
3番目のテンプレート引数にpointerを剥がして比較するless演算子を
以下のように渡します
g++ではm1は-std=c++17では不可ですが-std=c++20だと通ります
m1にはcomparatorの型しか情報を渡しておらず
m1は実装に関しては何も知らないはずなのですが
正しくpointeeでソートします なぜ?
#include <iostream>
#include <memory>
#include <map>
using namespace std;
int main ()
{
using Ptr = shared_ptr <int>;
auto comparator ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;});
using Map = map <Ptr, int, decltype (comparator)>;
// Map m0 (comparator); // -std=c++17と-std=c++20で可
Map m1; // -std=c++17で不可, -std=c++20で可
m1.insert (make_pair (make_shared <int> (2), 2));
m1.insert (make_pair (make_shared <int> (1), 1));
m1.insert (make_pair (make_shared <int> (3), 3));
for (const Map::value_type &key_value: m1)
cout << key_value.first << ' ' << key_value.second << '\n';
return 0;
}
3番目のテンプレート引数にpointerを剥がして比較するless演算子を
以下のように渡します
g++ではm1は-std=c++17では不可ですが-std=c++20だと通ります
m1にはcomparatorの型しか情報を渡しておらず
m1は実装に関しては何も知らないはずなのですが
正しくpointeeでソートします なぜ?
#include <iostream>
#include <memory>
#include <map>
using namespace std;
int main ()
{
using Ptr = shared_ptr <int>;
auto comparator ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;});
using Map = map <Ptr, int, decltype (comparator)>;
// Map m0 (comparator); // -std=c++17と-std=c++20で可
Map m1; // -std=c++17で不可, -std=c++20で可
m1.insert (make_pair (make_shared <int> (2), 2));
m1.insert (make_pair (make_shared <int> (1), 1));
m1.insert (make_pair (make_shared <int> (3), 3));
for (const Map::value_type &key_value: m1)
cout << key_value.first << ' ' << key_value.second << '\n';
return 0;
}
698デフォルトの名無しさん (ワッチョイ c75f-jpzT)
2022/12/13(火) 22:04:34.09ID:qOIMmk+U0 >>697
C++20でキャプチャ指定のないラムダ式がデフォルトコンストラクタを持つようになったからかな
https://ja.cppreference.com/w/cpp/language/lambda
C++20でキャプチャ指定のないラムダ式がデフォルトコンストラクタを持つようになったからかな
https://ja.cppreference.com/w/cpp/language/lambda
699デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/13(火) 22:11:52.14ID:FUi24cxt0 >>698
なるほどー!
なるほどー!
700デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/13(火) 22:27:14.40ID:FUi24cxt0 納得しちゃダメだった
ラムダ式の型は実装ごとに異なるみたいですね
以下__cxa_demangleがg++依存だけども
#include <iostream>
#include <memory>
using namespace std;
namespace abi {
extern "C" {char *__cxa_demangle (const char* __mangled_name, char* __output_buffer, size_t* __length, int* __status);}
}
string name_of (const type_info &p)
{
int status (0);
char *tmp (abi::__cxa_demangle (p.name (), 0, 0, &status));
string result (tmp);
free (tmp);
return result;
}
int main ()
{
using Ptr = shared_ptr <int>;
auto c0 ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;});
auto c1 ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs > *rhs;});
cout << (typeid (c0) == typeid (c1)) << '\n';
cout << name_of (typeid (c0)) << '\n'
<< name_of (typeid (c1)) << '\n';
return 0;
}
$ g++ -std=c++20 test.cpp
$ ./a.out
0
main::{lambda(std::shared_ptr<int> const&, std::shared_ptr<int> const&)#1}
main::{lambda(std::shared_ptr<int> const&, std::shared_ptr<int> const&)#2}
ラムダ式の型は実装ごとに異なるみたいですね
以下__cxa_demangleがg++依存だけども
#include <iostream>
#include <memory>
using namespace std;
namespace abi {
extern "C" {char *__cxa_demangle (const char* __mangled_name, char* __output_buffer, size_t* __length, int* __status);}
}
string name_of (const type_info &p)
{
int status (0);
char *tmp (abi::__cxa_demangle (p.name (), 0, 0, &status));
string result (tmp);
free (tmp);
return result;
}
int main ()
{
using Ptr = shared_ptr <int>;
auto c0 ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;});
auto c1 ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs > *rhs;});
cout << (typeid (c0) == typeid (c1)) << '\n';
cout << name_of (typeid (c0)) << '\n'
<< name_of (typeid (c1)) << '\n';
return 0;
}
$ g++ -std=c++20 test.cpp
$ ./a.out
0
main::{lambda(std::shared_ptr<int> const&, std::shared_ptr<int> const&)#1}
main::{lambda(std::shared_ptr<int> const&, std::shared_ptr<int> const&)#2}
701デフォルトの名無しさん (ワッチョイ 675f-3TNT)
2022/12/13(火) 23:32:00.27ID:vjOTFb3s0 >>697
> m1にはcomparatorの型しか情報を渡しておらず
> m1は実装に関しては何も知らないはずなのですが
ここが思い込みかと。
ラムダ式のクラス型に比較関数が含まれてて、その内容もインスタンスに依存しないし、
比較方法は十分伝わってるから問題ないということで何も不思議じゃないと思う。
> m1にはcomparatorの型しか情報を渡しておらず
> m1は実装に関しては何も知らないはずなのですが
ここが思い込みかと。
ラムダ式のクラス型に比較関数が含まれてて、その内容もインスタンスに依存しないし、
比較方法は十分伝わってるから問題ないということで何も不思議じゃないと思う。
702デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/13(火) 23:43:34.19ID:FUi24cxt0703デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/13(火) 23:48:00.37ID:FUi24cxt0 関数ポインタと書きましたが
関数オブジェクトとの相似で考えると不思議じゃないですね
関数オブジェクトも型で実装の情報を渡しますから
失礼しました
関数オブジェクトとの相似で考えると不思議じゃないですね
関数オブジェクトも型で実装の情報を渡しますから
失礼しました
704デフォルトの名無しさん (テテンテンテン MM8f-0RkQ)
2022/12/14(水) 08:35:41.62ID:YVPbaJHSM >>687
c++のunorderd_/(ordered_)は要素をキーにしてコレクションがソート済みになるかどうかを意味してると考えれば
全然違うよ。標準くらい読みなよ。
Associative containersとUnordered associative containerの本質的な違いはキーの定義。
Associative containersのキーは順序で比較可能でなくてはならず、Unordered associative containerは同値で判定可能でなくてはならない。
ついでに言うと、配列は(記憶に間違いなければ)直接メモリ番地で指定できなきゃならなくて、キー(みたいなもの)も(正)整数でなくてはならなかったはず。
c++のunorderd_/(ordered_)は要素をキーにしてコレクションがソート済みになるかどうかを意味してると考えれば
全然違うよ。標準くらい読みなよ。
Associative containersとUnordered associative containerの本質的な違いはキーの定義。
Associative containersのキーは順序で比較可能でなくてはならず、Unordered associative containerは同値で判定可能でなくてはならない。
ついでに言うと、配列は(記憶に間違いなければ)直接メモリ番地で指定できなきゃならなくて、キー(みたいなもの)も(正)整数でなくてはならなかったはず。
705デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/14(水) 08:45:51.73ID:MH9vv9Il0 配列の添字がキーだと思ってる人と
配列の中身がキーだと思ってる人
とじゃ会話が成り立たない
実際はどちらもキーではない
配列の中身がキーだと思ってる人
とじゃ会話が成り立たない
実際はどちらもキーではない
706デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/14(水) 09:11:41.03ID:F4iAWC8Wd ねえパパ、バカって何?
簡単なことを難しく言う人のことだよ
う~ん、よくわかんないや
簡単なことを難しく言う人のことだよ
う~ん、よくわかんないや
707デフォルトの名無しさん (スップ Sdff-C7Mp)
2022/12/14(水) 09:19:31.03ID:0zkFeBrgd 標準の話をするならvectorは連想配列じゃないしorderとか考えるものでもない
708デフォルトの名無しさん (アウアウウー Sa6b-SJNI)
2022/12/14(水) 09:39:28.51ID:iS/QLVofa vectorで添字アクセスするのはなんか違う
709デフォルトの名無しさん (テテンテンテン MM8f-PRdN)
2022/12/14(水) 09:55:06.54ID:fk0KXlHdM >>同値で判定可能
同値「かどうか」判定可能じゃないの?
>>配列は直接メモリ番地で〜
意味不明
同値「かどうか」判定可能じゃないの?
>>配列は直接メモリ番地で〜
意味不明
710デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 10:35:37.85ID:Y6rgBuPWd 定義もせずに真偽を議論しようとするアホ
711デフォルトの名無しさん (ワッチョイ 479c-0RkQ)
2022/12/14(水) 11:33:30.37ID:ZSc/wamY0 >>709
>同値「かどうか」判定可能じゃないの?
意味不明。
厳密に言うなら、Unordered associative containerが要求しているのはa == b a != b。
同値「かどうか」とか曖昧な突っ込みで何やりたいの?
>同値「かどうか」判定可能じゃないの?
意味不明。
厳密に言うなら、Unordered associative containerが要求しているのはa == b a != b。
同値「かどうか」とか曖昧な突っ込みで何やりたいの?
712デフォルトの名無しさん (ワッチョイ a7e4-5DNi)
2022/12/14(水) 12:05:38.08ID:apgWSyiy0 >>704
なるほどだいたい理解した
つまり最初の話に戻るなら unordered_multivector というものを考えた場合、格納する要素を a == b と a != b が定義されているものに限定して、
最悪の実装を考えると要素の格納方法は vector そのもので良くて要素のサーチは先頭からリニアに a == b をチェックしていくことになり、
unordered_vector ならば要素格納時に a == b なものを除外すればよいというわけだね
なるほどだいたい理解した
つまり最初の話に戻るなら unordered_multivector というものを考えた場合、格納する要素を a == b と a != b が定義されているものに限定して、
最悪の実装を考えると要素の格納方法は vector そのもので良くて要素のサーチは先頭からリニアに a == b をチェックしていくことになり、
unordered_vector ならば要素格納時に a == b なものを除外すればよいというわけだね
713デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 12:13:00.02ID:Y6rgBuPWd (使い所が無い)新たなコンテナを考えるスレじゃないと思う
当然Perlのスレでもない
当然Perlのスレでもない
714デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 12:23:38.93ID:Y6rgBuPWd C++の配列がordered, unorderedどちらの分類に近いかなら
キーが配列の添字 ==> ordered
キーが配列の中身 ==> unordered
キーが配列の添字 ==> ordered
キーが配列の中身 ==> unordered
715デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 12:29:53.77ID:Y6rgBuPWd716デフォルトの名無しさん (テテンテンテン MM8f-0RkQ)
2022/12/14(水) 12:39:11.82ID:14xvhmEyM >>712
>>705
中身とキー(みたいなもの。インデックス・添字)は別物。
あと、標準だと
The elements of a
vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other
than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
だから、vector にunorderとかmultiとか考えても意味がない。混乱の元だからやめたほうがいい。
>>705
中身とキー(みたいなもの。インデックス・添字)は別物。
あと、標準だと
The elements of a
vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other
than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
だから、vector にunorderとかmultiとか考えても意味がない。混乱の元だからやめたほうがいい。
717デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 13:40:10.14ID:Y6rgBuPWd setはキーも中身も同じ
718デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/14(水) 13:44:24.99ID:F4iAWC8Wd ハッシュの配列はハッシュではない
719デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 13:52:25.03ID:Y6rgBuPWd720デフォルトの名無しさん (スップ Sdff-C7Mp)
2022/12/14(水) 14:28:12.41ID:0zkFeBrgd vectorにinsertがある
添字はkeyではなくindexでしかない
何にとってorderedであるかはプログラマーに委ねられている
添字はkeyではなくindexでしかない
何にとってorderedであるかはプログラマーに委ねられている
721デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 16:26:53.57ID:Y6rgBuPWd 訂正
vectorの添字はuniqueでordered
vectorの中身はmultiでunordered
vectorの添字はuniqueでordered
vectorの中身はmultiでunordered
722デフォルトの名無しさん (アウアウクー MM1b-PRdN)
2022/12/14(水) 17:18:36.72ID:qZt9MbKWM >>711
いや「同値で判定可能」って日本語として意味通ってないじゃん
取れる揚げ足を作った奴が悪いよ
「厳密に言うなら〜が要求しているのは a==b a!=b」も全然厳密じゃないじゃん
a, b が何なのかも書いてないし、operator== と operator!= が定義さえされてればいいのか (a==b) ^ (a|=b) が true である必要まであるのかもその書き方だと分からない
いや「同値で判定可能」って日本語として意味通ってないじゃん
取れる揚げ足を作った奴が悪いよ
「厳密に言うなら〜が要求しているのは a==b a!=b」も全然厳密じゃないじゃん
a, b が何なのかも書いてないし、operator== と operator!= が定義さえされてればいいのか (a==b) ^ (a|=b) が true である必要まであるのかもその書き方だと分からない
723デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 17:36:27.63ID:Y6rgBuPWd ordered ≠ 全順序
== : 同値関係ではない
== : 同値関係ではない
724デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 17:42:08.99ID:Y6rgBuPWd == が同値関係であるとは
a == a
a == b ⇒ b == a
a == b, b == c ⇒ a == c
a == a
a == b ⇒ b == a
a == b, b == c ⇒ a == c
725デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/14(水) 17:58:56.90ID:ekFaWlb/M >>697
>m1は実装に関しては何も知らないはずなのですが
>正しくpointeeでソートします なぜ?
結論から言うと、ラムダ式は 関数呼び出し演算子 operator()() を
持った名前なし functor に対応していて、「デフォルト値」で構築
しても機能を果たすから。
[詳細]
ラムダ式は、名前なし functor で、関数呼び出し演算子 operator()() を持った
クラスに対応している。いまの場合、
auto comparator ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;});
は、
class SomeFunctor {
public:
bool operator()(const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;}
};
に対応していて、
SomeFunctor cmp{};
で SomeFunctor のオブジェクトを作ってから、
bool b = cmp(lhs, rhs);
とすると比較できる。
故に map クラスは SomeFunctor のオブジェクトをデフォルト値で
初期化すればいいことになるから、ユーザーが SomeFunctor の初期値
を渡さなくて良い。
実際に、mapクラスは、デフォルト値で初期化した SomeFunctor のオブジェクトを
基本クラスのメンバ変数に(実質的に)持っている。
>m1は実装に関しては何も知らないはずなのですが
>正しくpointeeでソートします なぜ?
結論から言うと、ラムダ式は 関数呼び出し演算子 operator()() を
持った名前なし functor に対応していて、「デフォルト値」で構築
しても機能を果たすから。
[詳細]
ラムダ式は、名前なし functor で、関数呼び出し演算子 operator()() を持った
クラスに対応している。いまの場合、
auto comparator ([] (const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;});
は、
class SomeFunctor {
public:
bool operator()(const Ptr &lhs, const Ptr &rhs) {return *lhs < *rhs;}
};
に対応していて、
SomeFunctor cmp{};
で SomeFunctor のオブジェクトを作ってから、
bool b = cmp(lhs, rhs);
とすると比較できる。
故に map クラスは SomeFunctor のオブジェクトをデフォルト値で
初期化すればいいことになるから、ユーザーが SomeFunctor の初期値
を渡さなくて良い。
実際に、mapクラスは、デフォルト値で初期化した SomeFunctor のオブジェクトを
基本クラスのメンバ変数に(実質的に)持っている。
726デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/14(水) 18:01:30.49ID:ekFaWlb/M727デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/14(水) 18:13:49.08ID:ekFaWlb/M >>704
いや、ordered_が付かないmapやsetは、順序で並び替えることも定義の一部になっていて、
範囲forで巡ると、挿入した順序ではなく、比較関数で比較した結果に基いてソートされた順序になる。
https://stackoverflow.com/questions/7648756/is-the-order-of-iterating-through-stdmap-known-and-guaranteed-by-the-standard
Yes, that's guaranteed. Moreover, *begin() gives you the smallest
C++
・std::map is a sorted associative container
https://stackoverflow.com/questions/11274978/are-c-stdmapstring-string-ordered
are STL maps ordered?
Yes, a std::map<K,V> is ordered based on the key, K, using std::less<K> to compare objects, by default.
So if I iterate over it, it will iterate with the first insert string first?
No. It will iterate based on the sorted order, not the order that you inserted elements. In the case of std::string, it sorts in lexicographic order (alphabetic order).
If you want to iterate based on the insertion order, you're better off using a sequence container, such as a std::vector or a std::list.
いや、ordered_が付かないmapやsetは、順序で並び替えることも定義の一部になっていて、
範囲forで巡ると、挿入した順序ではなく、比較関数で比較した結果に基いてソートされた順序になる。
https://stackoverflow.com/questions/7648756/is-the-order-of-iterating-through-stdmap-known-and-guaranteed-by-the-standard
Yes, that's guaranteed. Moreover, *begin() gives you the smallest
C++
・std::map is a sorted associative container
https://stackoverflow.com/questions/11274978/are-c-stdmapstring-string-ordered
are STL maps ordered?
Yes, a std::map<K,V> is ordered based on the key, K, using std::less<K> to compare objects, by default.
So if I iterate over it, it will iterate with the first insert string first?
No. It will iterate based on the sorted order, not the order that you inserted elements. In the case of std::string, it sorts in lexicographic order (alphabetic order).
If you want to iterate based on the insertion order, you're better off using a sequence container, such as a std::vector or a std::list.
728デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/14(水) 18:15:48.90ID:ekFaWlb/M >>727
誤: いや、ordered_が付かないmapやsetは、順序で並び替えることも定義の一部になっていて、
正: いや、unordered_が付かないmapやsetは、順序で並び替えることも定義の一部になっていて、
誤: いや、ordered_が付かないmapやsetは、順序で並び替えることも定義の一部になっていて、
正: いや、unordered_が付かないmapやsetは、順序で並び替えることも定義の一部になっていて、
729デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 18:16:04.80ID:Y6rgBuPWd730デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/14(水) 18:20:54.42ID:ekFaWlb/M >>702, 703
そういうことやね。
ラムダ式は、関数呼び出し演算子 operator()()を持ったクラスに対応していて、
その演算子が、ラムダ式の中身になっているから、テンプレート引数に
クラスの型を渡すだけで関数を渡せる。
ローカル変数をキャプチャしている場合は、どうなっているか良く知らないけども、
そういうことやね。
ラムダ式は、関数呼び出し演算子 operator()()を持ったクラスに対応していて、
その演算子が、ラムダ式の中身になっているから、テンプレート引数に
クラスの型を渡すだけで関数を渡せる。
ローカル変数をキャプチャしている場合は、どうなっているか良く知らないけども、
731デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 18:31:09.04ID:Y6rgBuPWd732デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 18:32:24.38ID:Y6rgBuPWd >>728
じゃんけん型の場合はどうなるんだろうねえ
じゃんけん型の場合はどうなるんだろうねえ
733デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/14(水) 18:34:00.96ID:ekFaWlb/M734デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/14(水) 18:36:10.47ID:ekFaWlb/M735デフォルトの名無しさん (スプッッ Sd7f-GCrc)
2022/12/14(水) 18:38:06.37ID:boxWAqPPd int x,y;
auto f = [&x,y](){};
のとき、
fの型は
struct{
int& _x;
int _y;
void operator()();
};
相当だとは思う。
コンストラクタ周りがどういう扱いされてるかはわからん
auto f = [&x,y](){};
のとき、
fの型は
struct{
int& _x;
int _y;
void operator()();
};
相当だとは思う。
コンストラクタ周りがどういう扱いされてるかはわからん
736デフォルトの名無しさん (テテンテンテン MM8f-0RkQ)
2022/12/14(水) 18:39:44.53ID:14xvhmEyM >>722
c++標準に言えよ。
c++標準に言えよ。
737デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 18:42:43.51ID:Y6rgBuPWd >>734
なにその言い訳www
なにその言い訳www
738デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 18:45:03.96ID:Y6rgBuPWd 逆に
構造を知らないでオーダーだけ丸暗記してるようなのがいるとでも思ってる?
構造を知らないでオーダーだけ丸暗記してるようなのがいるとでも思ってる?
739デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 19:02:37.51ID:Y6rgBuPWd >>733
はい
はい
740デフォルトの名無しさん (テテンテンテン MM8f-0RkQ)
2022/12/14(水) 19:04:38.48ID:YVPbaJHSM >>727
key とelementが紛らわしいなぁ。
c++標準は「keyで並び替える」。setはkeyがelementになるので結果として「elementで並び替えたのと一緒」となるだけ。key とelement をしっかり区別しないと擬似問題になるよ。
key とelementが紛らわしいなぁ。
c++標準は「keyで並び替える」。setはkeyがelementになるので結果として「elementで並び替えたのと一緒」となるだけ。key とelement をしっかり区別しないと擬似問題になるよ。
741デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 19:09:19.21ID:Y6rgBuPWd742デフォルトの名無しさん (テテンテンテン MM8f-0RkQ)
2022/12/14(水) 19:25:11.39ID:14xvhmEyM743デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 19:27:27.41ID:Y6rgBuPWd そのままの意味
744デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 19:29:17.49ID:Y6rgBuPWd 配列の中身は順序が定義されてる必要はなく
複数の値も取り得る
複数の値も取り得る
745デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/14(水) 19:33:54.85ID:Y6rgBuPWd 配列の中身をmultisetのkey,element
配列のインデックスをmultisetの要素のn番目のn
ととらえれば配列はmultiでunordered
配列の中身をelement
配列のインデックスをkey
ととらえれば配列はuniqueでordered
実際はどちらでもない
配列のインデックスをmultisetの要素のn番目のn
ととらえれば配列はmultiでunordered
配列の中身をelement
配列のインデックスをkey
ととらえれば配列はuniqueでordered
実際はどちらでもない
746デフォルトの名無しさん (ワッチョイ bf8c-0RkQ)
2022/12/14(水) 19:48:43.68ID:6VpEeBw/0747デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/14(水) 19:57:11.36ID:MH9vv9Il0 a[0] = 0;
a[1] = 0;
a[1] = 0;
748デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/14(水) 20:03:19.82ID:MH9vv9Il0 multi : 別の場所に同じ値を入れられる、同じ値を複数個保持出来る
749デフォルトの名無しさん (ワッチョイ 27c2-aipL)
2022/12/14(水) 20:44:33.97ID:QXbvEgmH0 声のでかさが正義だと思っている、どっかの山猿軍団みたいなやつがいるな
750デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/14(水) 21:17:02.90ID:x1JxbarV0751デフォルトの名無しさん (アウアウウー Sa6b-2vTk)
2022/12/14(水) 21:22:32.15ID:XhtdH9iqa >>691-692
知ってた
知ってた
752デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/14(水) 21:59:55.78ID:K5HiKCY5M753デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/14(水) 22:46:07.31ID:MH9vv9Il0 >>752
例えばだれ?
例えばだれ?
754デフォルトの名無しさん (ワッチョイ bf8c-eoOe)
2022/12/14(水) 22:58:57.25ID:6VpEeBw/0 >>747 >>748
multimapの"multi"の意味と違うなぁ。それはmapでもできる話じゃない?
cpprefjpに解説あるから調べたら?
C++ Standards だと22.2.6.4ですな。
(N4849)
An associative container supports unique keys if it may contain at most one element for each key.
Otherwise, it supports equivalent keys.
The set and map classes support unique keys; the multiset and multimap classes support equivalent keys.
multimapの"multi"の意味と違うなぁ。それはmapでもできる話じゃない?
cpprefjpに解説あるから調べたら?
C++ Standards だと22.2.6.4ですな。
(N4849)
An associative container supports unique keys if it may contain at most one element for each key.
Otherwise, it supports equivalent keys.
The set and map classes support unique keys; the multiset and multimap classes support equivalent keys.
755デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/14(水) 23:00:05.46ID:K5HiKCY5M >>753
失礼だけど、ここの人、ほぼ全員。
失礼だけど、ここの人、ほぼ全員。
756デフォルトの名無しさん (ワッチョイ bf8c-eoOe)
2022/12/14(水) 23:31:04.79ID:6VpEeBw/0757デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/14(水) 23:35:44.65ID:K5HiKCY5M >>756
なぜそう思うかって言うと、俺が言ったことがちゃんと通じる相手も存在しているからだよ。
客観的にハイレベルだと思える人には俺の言ったことが通じる。
しかも、この話だと確実に通じると思ったことはちゃんと確実に通じる。
ところが、この板だと結果は惨敗。全く通じなくて、逆にけなされ、馬鹿にされる。
なぜそう思うかって言うと、俺が言ったことがちゃんと通じる相手も存在しているからだよ。
客観的にハイレベルだと思える人には俺の言ったことが通じる。
しかも、この話だと確実に通じると思ったことはちゃんと確実に通じる。
ところが、この板だと結果は惨敗。全く通じなくて、逆にけなされ、馬鹿にされる。
758デフォルトの名無しさん (ワッチョイ 7fcf-FUlb)
2022/12/14(水) 23:37:23.23ID:3zhhSsQg0 よせやい。照れるわ
759デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/14(水) 23:47:40.49ID:MH9vv9Il0760デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/14(水) 23:48:26.06ID:MH9vv9Il0 >>757
お前の日本語が悪いだけじゃね?
お前の日本語が悪いだけじゃね?
761デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/14(水) 23:50:51.18ID:MH9vv9Il0 お前も俺が書いたこと理解してないし
俺からみたらお前はアホ
俺からみたらお前はアホ
762デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/14(水) 23:54:44.29ID:MH9vv9Il0763デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/14(水) 23:58:15.35ID:K5HiKCY5M764デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/15(木) 00:02:56.94ID:YuqRQs180 お前東大生?
765デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/15(木) 00:16:01.78ID:3Zw/afEhM >>764
身元がばれるから言わん。
身元がばれるから言わん。
766デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/15(木) 00:22:28.27ID:YuqRQs180 あんまり東大の品位を下げるような発言はやめてね
767デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/15(木) 00:26:32.79ID:3Zw/afEhM >>766
なお、東大生でも理解力が無い人は理解力無いと思う。
本当に頭のいいのは、一部の学科に集中している。
東大以外でもレベルの高い大学なら理解できる人多いぞ。
ここにも東大生は来てるかも知れんが、残念ながら頭がいいタイプの人は来てない。
なお、東大生でも理解力が無い人は理解力無いと思う。
本当に頭のいいのは、一部の学科に集中している。
東大以外でもレベルの高い大学なら理解できる人多いぞ。
ここにも東大生は来てるかも知れんが、残念ながら頭がいいタイプの人は来てない。
768デフォルトの名無しさん (ワッチョイ 7fcf-FUlb)
2022/12/15(木) 00:27:32.73ID:NC87g1Wm0 これだけ内容の無い連投も珍しいな
769デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/15(木) 00:33:45.79ID:YuqRQs180 理解力が無い人は理解力が無い
当たり前ですねwww
当たり前ですねwww
770デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/15(木) 00:42:28.23ID:YuqRQs180 0点の人か
言い訳が見苦しいねえ
言い訳が見苦しいねえ
771デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/15(木) 00:48:44.56ID:3Zw/afEhM ホリエモンや高橋洋一も言っていたが、レベルが合わないと話してることが
全く理解されなくて、むしろ馬鹿にされ、阻害されるものなんだぞ。
高橋洋一にいたっては東大に行っても理解されなかったそうだ。
根本的に頭がいい人はそうなる。
日本では特にそういう人を社会から除外するし。
全く理解されなくて、むしろ馬鹿にされ、阻害されるものなんだぞ。
高橋洋一にいたっては東大に行っても理解されなかったそうだ。
根本的に頭がいい人はそうなる。
日本では特にそういう人を社会から除外するし。
772デフォルトの名無しさん (ワッチョイ 7fcf-FUlb)
2022/12/15(木) 00:50:57.77ID:NC87g1Wm0 いや、雑談スレじゃねーし
773デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/15(木) 00:56:26.15ID:3Zw/afEhM >>772
このスレでは、目に余るものがあって、
そもそも、学級崩壊しているような状態で、まともに議論できない。
正しいことを言ってる人を馬鹿にして、間違ってる子と言ってる人が大きな
顔をして、自分が正しいことを言っているかのような態度をとる。
そもそも議論の土台が出来て無い。
まずは、ホームルームや道徳の様なことから始めなくては。
このスレでは、目に余るものがあって、
そもそも、学級崩壊しているような状態で、まともに議論できない。
正しいことを言ってる人を馬鹿にして、間違ってる子と言ってる人が大きな
顔をして、自分が正しいことを言っているかのような態度をとる。
そもそも議論の土台が出来て無い。
まずは、ホームルームや道徳の様なことから始めなくては。
774デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/15(木) 01:09:34.07ID:5pPRyT0s0 コミュニケーションってのはコンパイラと違って
言語モデルやその背後にある思考モデルはダイナミックに変化する
それについていけなければ会話は成立しない
更に特定の一つコンパイラを相手にしていれば良いという訳でもない
言語モデルやその背後にある思考モデルはダイナミックに変化する
それについていけなければ会話は成立しない
更に特定の一つコンパイラを相手にしていれば良いという訳でもない
775デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/15(木) 01:16:26.87ID:3Zw/afEhM776デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/15(木) 01:24:05.73ID:5pPRyT0s0 会話ってのは一人でやるもんじゃないんだよ
双方が相手の頭の中を推定できたときに初めて噛み合う
相手に自分の頭の中を推定しやすいような
手掛かりを上手に出すのも技術のうち
双方が相手の頭の中を推定できたときに初めて噛み合う
相手に自分の頭の中を推定しやすいような
手掛かりを上手に出すのも技術のうち
777デフォルトの名無しさん (オイコラミネオ MM7b-VZV0)
2022/12/15(木) 01:27:53.05ID:3Zw/afEhM778デフォルトの名無しさん (ワッチョイ bf8c-eoOe)
2022/12/15(木) 01:58:19.99ID:yiRddat50 >>762
>745を見直したけど意味不明だわ。
これは>719
>vectorのキーはuniqueでordered
>vectorの中身はmultiでunordered
>考えるまでもなく自明
の説明ということだよな?
> 配列の中身をmultisetのkey,element
> 配列のインデックスをmultisetの要素のn番目のn
> ととらえれば配列はmultiでunordered
で配列をpair<K,T>[]に限定するような話が突然出てくる。
>712のunordered_vectorに頭の中身が引きずられてない?
そんなにunordered_vectorの話がしたいの? 俺は嫌だよ。
>配列の中身をelement
>配列のインデックスをkey
>ととらえれば配列はuniqueでordered
はかすかに議論の流れに沿っているけど、
>実際はどちらでもない
で放り投げられているから、結論として何を主張したいのかも分からん。
これじゃ「>719はどちらも間違い」という主張にしか見えん。
>745にマトモな結論も主張も無いから、この話がどう>747 >748 につながるかも分からん。
エスパーじゃないんだから、バラバラで繋がりの無い情報を読んでも>762の頭の中なんて分からんよ。
「だとしたらアホだ 」と言う前に、引用レスぐらいちゃんと読み直して補足情報ぐらい書いたら?
>745を見直したけど意味不明だわ。
これは>719
>vectorのキーはuniqueでordered
>vectorの中身はmultiでunordered
>考えるまでもなく自明
の説明ということだよな?
> 配列の中身をmultisetのkey,element
> 配列のインデックスをmultisetの要素のn番目のn
> ととらえれば配列はmultiでunordered
で配列をpair<K,T>[]に限定するような話が突然出てくる。
>712のunordered_vectorに頭の中身が引きずられてない?
そんなにunordered_vectorの話がしたいの? 俺は嫌だよ。
>配列の中身をelement
>配列のインデックスをkey
>ととらえれば配列はuniqueでordered
はかすかに議論の流れに沿っているけど、
>実際はどちらでもない
で放り投げられているから、結論として何を主張したいのかも分からん。
これじゃ「>719はどちらも間違い」という主張にしか見えん。
>745にマトモな結論も主張も無いから、この話がどう>747 >748 につながるかも分からん。
エスパーじゃないんだから、バラバラで繋がりの無い情報を読んでも>762の頭の中なんて分からんよ。
「だとしたらアホだ 」と言う前に、引用レスぐらいちゃんと読み直して補足情報ぐらい書いたら?
779デフォルトの名無しさん (ワッチョイ bf8c-eoOe)
2022/12/15(木) 02:20:47.08ID:yiRddat50 >>775
そりゃ、有り難くも相手が理解しようと努力してくれているからだろ。
会話で「情報の非対称性」は意識している?
相手がどのような情報を持っているのかを無視して、自分の立場を
ゴリ押しして相手にマウントしようとすれば、そりゃ相手に嫌われるわ。
まあ、相手に嫌われるのが目的ならそれでOKだけど。
そりゃ、有り難くも相手が理解しようと努力してくれているからだろ。
会話で「情報の非対称性」は意識している?
相手がどのような情報を持っているのかを無視して、自分の立場を
ゴリ押しして相手にマウントしようとすれば、そりゃ相手に嫌われるわ。
まあ、相手に嫌われるのが目的ならそれでOKだけど。
780デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/15(木) 07:04:36.25ID:cCqUdoUCd ハッシュでないものをハッシュということにしたくてヤダジタ大暴れ
みっともねえな
みっともねえな
781デフォルトの名無しさん (アウアウウー Sa6b-2vTk)
2022/12/15(木) 07:12:05.83ID:hWaEpCH1a782デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/15(木) 07:27:41.09ID:dbf8SNdVd でかい声出しても人を小馬鹿にしても
それでハッシュでないものがハッシュになるわけでなし
無駄で関係ない努力をし、そのために他人に迷惑が及んでも
構わないという自己中心的なやつ
それでハッシュでないものがハッシュになるわけでなし
無駄で関係ない努力をし、そのために他人に迷惑が及んでも
構わないという自己中心的なやつ
783デフォルトの名無しさん (アウアウウー Sa6b-2vTk)
2022/12/15(木) 07:31:15.67ID:hWaEpCH1a >>768
一人二(+a)役でピンポンしてるだけでは
一人二(+a)役でピンポンしてるだけでは
784デフォルトの名無しさん (ワッチョイ a7f0-exKU)
2022/12/15(木) 07:50:47.01ID:YuqRQs180 >>745でわからないアホと会話するのは不可能
785デフォルトの名無しさん (ワッチョイ ffa4-+9+b)
2022/12/15(木) 07:52:47.62ID:0irp5Zs10786デフォルトの名無しさん (テテンテンテン MM8f-0RkQ)
2022/12/15(木) 12:23:36.75ID:WaHslr7gM787デフォルトの名無しさん (テテンテンテン MM8f-0RkQ)
2022/12/15(木) 12:47:10.10ID:WaHslr7gM hashのレスはあんまり読んでいないんだけど、c++標準のhashの話だよね?
c++標準と関係の無いhashをc++スレで持ち出してhash hash 言っているわけじゃないよね?
まさかそんなアホいないよね?
c++標準と関係の無いhashをc++スレで持ち出してhash hash 言っているわけじゃないよね?
まさかそんなアホいないよね?
788デフォルトの名無しさん (ワッチョイ df01-0RkQ)
2022/12/15(木) 13:55:56.86ID:adPtbWG70 いまだにハッシュガーとか言ってるのは何が悔しいのか粘着キチだからスルーでOk
789デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/15(木) 16:19:30.66ID:dbf8SNdVd >>787
いやC++に限らない一般論としてハッシュとは何が明らかに分かってないやつが暴れてんの
いやC++に限らない一般論としてハッシュとは何が明らかに分かってないやつが暴れてんの
790デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/15(木) 16:24:26.31ID:dbf8SNdVd 見たところPerlスレ民のほうが
キチガイを追い出すのはうまかったようだな
キチガイを追い出すのはうまかったようだな
791デフォルトの名無しさん (ワッチョイ a701-u86g)
2022/12/15(木) 19:54:56.58ID:SaYQ/lLy0 Perl民は70代中心だからな。
792デフォルトの名無しさん (ワッチョイ df28-GD9R)
2022/12/16(金) 00:24:44.89ID:kaubkXoa0 心の欲するところに従えども矩を踰えず、
793デフォルトの名無しさん (ワッチョイ dfad-KKgq)
2022/12/16(金) 08:43:50.12ID:Sk8Nrr7L0 名前、それ自体がハッシュだよ
ありとあらゆるものが名前を与えられることによって唯一性・独自性を確保する
つまり、人間の脳は万物をハッシュで管理している
ありとあらゆるものが名前を与えられることによって唯一性・独自性を確保する
つまり、人間の脳は万物をハッシュで管理している
794デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/16(金) 08:57:47.68ID:3/NVi56ad ほらな
何にもわかっちゃいねえ
乱数や暗号との違いが言えねえぞコイツ
何にもわかっちゃいねえ
乱数や暗号との違いが言えねえぞコイツ
795デフォルトの名無しさん (スップ Sd7f-exKU)
2022/12/16(金) 09:10:39.36ID:wsa7u1K/d C++の話しようぜ
796デフォルトの名無しさん (ワッチョイ ffa4-+9+b)
2022/12/16(金) 10:09:11.46ID:zTEnSqew0 c++20のコンセプトとかモジュールとか<=>とか誰か使ってる?
797デフォルトの名無しさん (スフッ Sdff-exKU)
2022/12/16(金) 10:24:14.76ID:8MYQQby5d <=> 使ってる
798デフォルトの名無しさん (ワッチョイ e701-3npV)
2022/12/16(金) 11:19:29.52ID:rgyul2GY0 >>796,797
へー 初めて知った
へー 初めて知った
799デフォルトの名無しさん (アウアウウー Sa6b-DK8R)
2022/12/16(金) 12:00:08.46ID:8wSlC2cWa ウホッ演算子
800デフォルトの名無しさん (スッップ Sdff-c2mE)
2022/12/16(金) 12:09:30.80ID:3/NVi56ad <=>は便利だね
使い出すとやめられん
使い出すとやめられん
801デフォルトの名無しさん (ワッチョイ 675f-k8RX)
2022/12/16(金) 12:26:19.15ID:YwJTJAAR0 <=>初めて知ったけどめちゃ便利だな
うちの環境じゃ使えないのが残念だけど
うちの環境じゃ使えないのが残念だけど
802デフォルトの名無しさん (スプッッ Sd7f-GCrc)
2022/12/16(金) 15:18:01.45ID:h3Zax2und operator==のdefaultは便利だわ
803デフォルトの名無しさん (アウアウエー Sae2-oWW1)
2022/12/17(土) 02:36:30.45ID:ufrS8am+a a > b, a < b, a == b を一度に判定するだけの演算子の何がそんな便利やねん!
とおもったらこれ一つ定義するだけで各種比較演算子全部児童生成してくれるのね
なるほどこりゃ便利かも
とおもったらこれ一つ定義するだけで各種比較演算子全部児童生成してくれるのね
なるほどこりゃ便利かも
804デフォルトの名無しさん (ワッチョイ dbf0-gxLW)
2022/12/17(土) 05:21:21.32ID:dncno9m70 unorderedの比較の実装は相変わらず迷う
805デフォルトの名無しさん (ワッチョイ 3ebb-FgI+)
2022/12/17(土) 08:51:24.48ID:SViislQC0 ロリコンショタ歓喜じゃん
806デフォルトの名無しさん (ワッチョイ dbda-gxRJ)
2022/12/17(土) 09:11:20.17ID:rODQUlPF0 using rel_ops だとスコープ全体に影響でるから使用控えてたけど、operator<=>で全部解決出来るようになったのはいいな
807デフォルトの名無しさん (スップ Sd2a-gxLW)
2022/12/17(土) 09:32:05.93ID:XBBLmCjVd 3方があると4方も欲しくなる
a < b
a = b
a > b
unordered
結局戻り値4値の関数を作ることになる
a < b
a = b
a > b
unordered
結局戻り値4値の関数を作ることになる
808デフォルトの名無しさん (ワッチョイ 4a28-zlOH)
2022/12/17(土) 11:46:18.72ID:QZoKK6jA0 宇宙船演算子……!
ってオーバーロード……!
可能なの……?!
ってオーバーロード……!
可能なの……?!
809デフォルトの名無しさん (ワッチョイ 0f7c-NBcO)
2022/12/17(土) 12:25:08.76ID:dQNfWhWG0 >>807
std::partial_ordering返すようにすれば<=>で4方出来るぞ
std::partial_ordering返すようにすれば<=>で4方出来るぞ
810デフォルトの名無しさん (ワッチョイ dbda-gxRJ)
2022/12/17(土) 12:44:09.97ID:rODQUlPF0811デフォルトの名無しさん (ワッチョイ becf-DiWi)
2022/12/17(土) 14:06:58.32ID:t4TbQFP40 ストリーム入出力に使っていけ(※冗談です)
812デフォルトの名無しさん (ワッチョイ 4a28-zlOH)
2022/12/17(土) 14:23:32.76ID:QZoKK6jA0813デフォルトの名無しさん (スッップ Sd8a-kgXK)
2022/12/20(火) 07:42:37.51ID:louNKIVjd NaN同士の比較とかあるからな
814デフォルトの名無しさん (ワッチョイ db2d-ZR1D)
2022/12/20(火) 14:22:24.61ID:UPRI61by0 このスレ見てるとわかるがC++が好きって言ってるやつって知能低いな
815デフォルトの名無しさん (ワッチョイ a301-CLTW)
2022/12/20(火) 15:05:44.24ID:0942ga5D0 このスレには周囲に天才と言われる人がいるからそれは違うな
816デフォルトの名無しさん (ササクッテロロ Spb3-7wYa)
2022/12/20(火) 15:17:57.65ID:/qMRbodsp 自称だけどな
817デフォルトの名無しさん (スッップ Sd8a-kgXK)
2022/12/20(火) 15:21:56.61ID:louNKIVjd あんなやつに褒められても嬉しかねえよってやつに
どう思われようが関係ねーなあ
どう思われようが関係ねーなあ
818デフォルトの名無しさん (ワッチョイ 236f-s0Sd)
2022/12/25(日) 18:29:48.93ID:Dw6urQXv0 namespace std {
template <class T, std::size_t N>
struct array;
}
みたいに標準ライブラリの前方宣言を自作のヘッダに書くのってやっぱり未定義動作なんですかね?
template <class T, std::size_t N>
struct array;
}
みたいに標準ライブラリの前方宣言を自作のヘッダに書くのってやっぱり未定義動作なんですかね?
819デフォルトの名無しさん (ワッチョイ cf7c-5mfr)
2022/12/25(日) 18:51:26.23ID:PNih05NQ0 stdに勝手に宣言加えていいのは既存テンプレートの特殊化だけ
他は未定義
他は未定義
820はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/25(日) 20:29:17.71ID:8blj/qJt0 >>818
原則としては std 名前空間になんらかの宣言や定義を追加したら未定義ということになってる。
https://timsong-cpp.github.io/cppwp/n4861/namespace.std
その事例も該当すると思う。
条件付きで許されている特殊化はあるが C++20 から制限が強化された。
(従来は条件付きで「テンプレートの特殊化を追加できる」だったのが「クラステンプレートの特殊化を追加できる」に改められている。)
ユーザー定義型ごとのカスタマイズを許したい場面では Customization Point Object (CPO) を
活用する方向性なので特殊化でどうにかする必要もないし制限が強くなることはあっても緩和されることはないんじゃないかな。
原則としては std 名前空間になんらかの宣言や定義を追加したら未定義ということになってる。
https://timsong-cpp.github.io/cppwp/n4861/namespace.std
その事例も該当すると思う。
条件付きで許されている特殊化はあるが C++20 から制限が強化された。
(従来は条件付きで「テンプレートの特殊化を追加できる」だったのが「クラステンプレートの特殊化を追加できる」に改められている。)
ユーザー定義型ごとのカスタマイズを許したい場面では Customization Point Object (CPO) を
活用する方向性なので特殊化でどうにかする必要もないし制限が強くなることはあっても緩和されることはないんじゃないかな。
821デフォルトの名無しさん (ワイーワ2 FF33-kjyB)
2022/12/25(日) 21:15:27.65ID:BoLdymVdF そんな堅苦しい事なんて言わんでもええやん?
どんな弊害があるん?
どんな弊害があるん?
822デフォルトの名無しさん (ワッチョイ 6d5f-aH43)
2022/12/25(日) 22:24:02.06ID:9/OfwQI/0 >>821 標準ライブラリの変更にあたって、 std に宣言追加しているソースへの影響を考えないといけなくなる。
823デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/25(日) 22:39:45.88ID:8rnFU1jp0 >>822
リンクで失敗するので修正すれば良いだけでは?
リンクで失敗するので修正すれば良いだけでは?
824デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/25(日) 22:40:44.04ID:8rnFU1jp0 「未定義」ってほどには深刻な問題はないと思うんだよね
825デフォルトの名無しさん (ワッチョイ cf7c-5mfr)
2022/12/25(日) 23:02:22.44ID:PNih05NQ0 コンパイラがstdに勝手宣言がないことを前提にしたあらゆる最適化の結果を受け入れるなら別にいいと思うよ
俺は絶対に嫌だから関わらないでくれよ
俺は絶対に嫌だから関わらないでくれよ
826デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/25(日) 23:15:00.75ID:8rnFU1jp0827はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/26(月) 01:10:32.66ID:OBkbHJZM0 >>826
何が起きるか具体的にわからないから恐ろしいんだよ。
何が起きるか具体的にわからないから恐ろしいんだよ。
828デフォルトの名無しさん (ワッチョイ 8d01-s0Sd)
2022/12/26(月) 01:18:22.88ID:D/1vl6x80 >>827
ワクワクしてこないか?
ワクワクしてこないか?
829デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/26(月) 01:20:46.52ID:YnLWxzzl0 >>827
oresamaライブラリの中でoresama名前空間があって
arrayが定義されていたとして
oresamaライブラリとは別のプロジェクトで
oresama::array前方宣言したときに
起こりうることは予想がつくよね?
それがstd名前空間だと動作が未定義だとのことだけども
何が違うのか分かります?
oresamaライブラリの中でoresama名前空間があって
arrayが定義されていたとして
oresamaライブラリとは別のプロジェクトで
oresama::array前方宣言したときに
起こりうることは予想がつくよね?
それがstd名前空間だと動作が未定義だとのことだけども
何が違うのか分かります?
830デフォルトの名無しさん (ワッチョイ cf7c-5mfr)
2022/12/26(月) 01:30:35.37ID:2gdEMUwk0 >>829
コンパイラ様はstd以下を思うままに特別扱いしてカオスでアドホックな最適化処理をいくらでも入れることが許されてる
コンパイラ様はstd以下を思うままに特別扱いしてカオスでアドホックな最適化処理をいくらでも入れることが許されてる
831デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/26(月) 01:51:58.67ID:YnLWxzzl0832はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/26(月) 02:20:44.42ID:OBkbHJZM0 >>831
コンパイラの内部に興味を持って調べたいならどんどんやればいいよ。
詳しい人が増えるならそれはたいへん喜ばしい!
でも、リッチな C++ コンパイラのソースコードを読んで様々な最適化がどう組み合わさるかまで把握するのは
相当に高い技能を持った達人でないと無理なのでこのスレ程度ではなんもわからんと思う。
世の中にはこれを保守している人がいるんだからありがたい話だよな。
私がどこかで見たおぼろげな記憶では標準テンプレート関連の一部で
マングルのルールが異なる (名前が短くなるようにしてる?) というのがあるので
変なことをすると破綻することもあるのかもしれない。
コンパイラの内部に興味を持って調べたいならどんどんやればいいよ。
詳しい人が増えるならそれはたいへん喜ばしい!
でも、リッチな C++ コンパイラのソースコードを読んで様々な最適化がどう組み合わさるかまで把握するのは
相当に高い技能を持った達人でないと無理なのでこのスレ程度ではなんもわからんと思う。
世の中にはこれを保守している人がいるんだからありがたい話だよな。
私がどこかで見たおぼろげな記憶では標準テンプレート関連の一部で
マングルのルールが異なる (名前が短くなるようにしてる?) というのがあるので
変なことをすると破綻することもあるのかもしれない。
833デフォルトの名無しさん (ブーイモ MM5b-5fcg)
2022/12/26(月) 02:29:01.84ID:2Z6X9F6ZM なぜこうもわざわざ未定義動作を踏み抜きたいやつが多いのか
834はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/26(月) 02:33:59.35ID:OBkbHJZM0 コンパイラをナメてるからだろ。
「未定義動作つってもどうせこうなるだろう」という予測が出来ると信じている。
無理なのに。
「未定義動作つってもどうせこうなるだろう」という予測が出来ると信じている。
無理なのに。
835デフォルトの名無しさん (ワッチョイ 1301-iijX)
2022/12/26(月) 05:51:34.26ID:+xP92Jxa0 まあ単なるテンプレートライブラリなのにstdだけを特別扱いして最適化を図るのはちょっとやりすぎな気がしなくもない
836デフォルトの名無しさん (ワッチョイ ebda-w5mw)
2022/12/26(月) 07:41:41.79ID:zTKHQ8850 clangのソースコードはC++プログラムの書き方の勉強になりますね
837デフォルトの名無しさん (スプッッ Sddb-lg2t)
2022/12/26(月) 08:06:50.83ID:FVIubv9sd std::arrayってなんらかのusingであることが(コンパイラ側への制限として)許されてたりするんか?
もしarrayの実体がこんな実装だったら
namespase std::__internal {
template<class T, size_t>class array{...};
}
namespase std:: {
template<class T, size_t>using array=__internal<T,size>;
}
勝手にこれ書いたらまずくならんか?
namespase std{
template<class T, size_t>class array;
}
もしarrayの実体がこんな実装だったら
namespase std::__internal {
template<class T, size_t>class array{...};
}
namespase std:: {
template<class T, size_t>using array=__internal<T,size>;
}
勝手にこれ書いたらまずくならんか?
namespase std{
template<class T, size_t>class array;
}
838デフォルトの名無しさん (スプッッ Sdaf-tLuz)
2022/12/26(月) 09:12:05.09ID:5S/2UDN2d なるね
839デフォルトの名無しさん (ワッチョイ 8f7c-PRRE)
2022/12/26(月) 11:35:27.15ID:v25C8vnQ0 >>818
それやると特定のC++バージョン、特定のコンパイラでしか
コンパイルできないコードになりかねないし、
普通に #include <array> すればいいだろ。
それともそれが出来ない理由があるとか?
それやると特定のC++バージョン、特定のコンパイラでしか
コンパイルできないコードになりかねないし、
普通に #include <array> すればいいだろ。
それともそれが出来ない理由があるとか?
840デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/26(月) 12:12:38.12ID:YnLWxzzl0841デフォルトの名無しさん (アウアウウー Sa1f-SvsN)
2022/12/26(月) 13:31:39.98ID:6bMfB0bxa >未定義動作ってほど酷いこと
は?
は?
842はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/26(月) 13:38:20.67ID:OBkbHJZM0 >>840
未定義動作と定義されているんだから未定義動作としか言えんだろ。
未定義動作と定義されているんだから未定義動作としか言えんだろ。
843デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/26(月) 13:49:22.29ID:YnLWxzzl0 >>841
未定義動作とはコンパイルもリンクも通って実行できるけど
どんな動作をするか分からない(未定義)ので
事前に分かるコンパイルエラーやリンカーエラーに比べて
「酷い」と表現しました
いわゆる「鼻から悪魔」
未定義動作とはコンパイルもリンクも通って実行できるけど
どんな動作をするか分からない(未定義)ので
事前に分かるコンパイルエラーやリンカーエラーに比べて
「酷い」と表現しました
いわゆる「鼻から悪魔」
844デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/26(月) 13:51:12.76ID:YnLWxzzl0 >>842
まぁ規格に書かれちゃってるんだからそりゃそうですね
まぁ規格に書かれちゃってるんだからそりゃそうですね
845はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/26(月) 14:17:52.01ID:OBkbHJZM0 もしも「必ずエラーとして報告されるべき」みたいな仕様にしたら std の特別扱いが要るから
標準ヘッダのファイルに素朴に書くだけな実装はやりにくくなるし……。
標準ヘッダのファイルに素朴に書くだけな実装はやりにくくなるし……。
846デフォルトの名無しさん (ワッチョイ 2b01-s0Sd)
2022/12/26(月) 14:22:21.57ID:uyDYkqVs0 void InitBoard(void) // 盤を初期化
{
int x, y;
for (y = 0; y < YMAX; y++)
{
for (x = 0; x < XMAX; x++)
{
board[x][y] = 0;
}
for (x = 0; x < XMAX; x++)
{
num[x] = 0;
}
}
}
この処理の無駄を省くコードおしえてください
{
int x, y;
for (y = 0; y < YMAX; y++)
{
for (x = 0; x < XMAX; x++)
{
board[x][y] = 0;
}
for (x = 0; x < XMAX; x++)
{
num[x] = 0;
}
}
}
この処理の無駄を省くコードおしえてください
847デフォルトの名無しさん (アウアウウー Sa71-XYq7)
2022/12/26(月) 14:26:27.90ID:A7MLr6bua848デフォルトの名無しさん (スップ Sd03-FNX1)
2022/12/26(月) 14:26:50.08ID:9plh3gB/d memset(board, 0, sizeof board);
memset(num, 0, sizeof num);
memset(num, 0, sizeof num);
849デフォルトの名無しさん (ワッチョイ 95da-Axul)
2022/12/26(月) 14:33:45.39ID:a6eE731v0 >>846
つbzero,ZeroMemory
つbzero,ZeroMemory
850デフォルトの名無しさん (ブーイモ MMb3-5fcg)
2022/12/26(月) 14:39:30.42ID:EnLBjT8OM 標準に <iosfwd> あるくらいだし動機はわかるけども
あんま詳しくないけどモジュールはよってことなんかね?
あんま詳しくないけどモジュールはよってことなんかね?
851デフォルトの名無しさん (スプッッ Sddb-tLuz)
2022/12/26(月) 14:44:20.75ID:2wvNEB42d 禁止と言われて、そうですかと聞き分ける人と、ゴネる人がいるってことだ。
852デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/26(月) 14:49:02.84ID:YnLWxzzl0853はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/26(月) 14:50:30.84ID:OBkbHJZM0 >>846
std::fill を使うのが妥当じゃないかな?
memset でも普通は問題は起きないと思うけど
メモリブロック (バイト列) に対する操作だから board の型によっては
問題が起こることはなくもない。
std::fill を使うのが妥当じゃないかな?
memset でも普通は問題は起きないと思うけど
メモリブロック (バイト列) に対する操作だから board の型によっては
問題が起こることはなくもない。
854デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/26(月) 14:51:24.85ID:YnLWxzzl0 >>851
そういうことではない
文法的にダブルスタンダードになってるのが気持ち悪い
名前空間stdもoresamaも同じ取り扱いである方が
文法的に美しいって感じているから
実際には最適化のためにstdは特別扱いが規定されている
そういうことではない
文法的にダブルスタンダードになってるのが気持ち悪い
名前空間stdもoresamaも同じ取り扱いである方が
文法的に美しいって感じているから
実際には最適化のためにstdは特別扱いが規定されている
855デフォルトの名無しさん (アウアウウー Sa71-ufqB)
2022/12/26(月) 15:04:20.66ID:rUBUe8yFa (自分の環境だと)酷いことにはなってないから
未定義踏んでてもOK派?
勘弁してください
未定義踏んでてもOK派?
勘弁してください
856デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/26(月) 15:10:52.71ID:YnLWxzzl0 >>855
煽ってものらないよw 誰もそんなことは書いていない
酷いことになる事例を教えてねってことを書いています
どういうこと(最適化?)を想定してダブルスタンダードにしたのか
動機を知りたくないですか?
煽ってものらないよw 誰もそんなことは書いていない
酷いことになる事例を教えてねってことを書いています
どういうこと(最適化?)を想定してダブルスタンダードにしたのか
動機を知りたくないですか?
857デフォルトの名無しさん (ワッチョイ 95da-Axul)
2022/12/26(月) 15:12:35.95ID:a6eE731v0 fill_n(num,__countof(num),0)
上のboardは自分で考えるんだ
上のboardは自分で考えるんだ
858はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/26(月) 15:26:40.53ID:OBkbHJZM0 >>854
自分が作ったライブラリの名前空間に何を追加されても正しく動く (または必ずエラーになる) ように保証してんのか?
各ライブラリごとの挙動に保証していることと保証してないことがあるのは当たり前のことだろ。
お前のライブラリについての保証はお前がするから「言語では」関知しないってだけで、
oresama に何を追加してもよいことが保証されてるわけではない。
自分が作ったライブラリの名前空間に何を追加されても正しく動く (または必ずエラーになる) ように保証してんのか?
各ライブラリごとの挙動に保証していることと保証してないことがあるのは当たり前のことだろ。
お前のライブラリについての保証はお前がするから「言語では」関知しないってだけで、
oresama に何を追加してもよいことが保証されてるわけではない。
859デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/26(月) 16:14:39.95ID:YnLWxzzl0 >>858
たぶん伝わってないな
以下をユーザが自分のソースに書くのは>>820の言うように規格で禁じられている
namespace std {
template <class T, std::size_t N>
struct array;
}
同じくoresama::ARRAYなるカスタムのクラステンプレートが定義されていたとして
以下をユーザがソースに書くのは合法
namespace oresama {
template <class T, std::size_t N>
struct ARRAY;
}
これをダブルスタンダードで気持ちが悪いと思っている
最適化との説だけども
具体的なことを知っている人がいたら聞きたいな
たぶん伝わってないな
以下をユーザが自分のソースに書くのは>>820の言うように規格で禁じられている
namespace std {
template <class T, std::size_t N>
struct array;
}
同じくoresama::ARRAYなるカスタムのクラステンプレートが定義されていたとして
以下をユーザがソースに書くのは合法
namespace oresama {
template <class T, std::size_t N>
struct ARRAY;
}
これをダブルスタンダードで気持ちが悪いと思っている
最適化との説だけども
具体的なことを知っている人がいたら聞きたいな
860デフォルトの名無しさん (ワッチョイ 5328-gB2L)
2022/12/26(月) 16:17:49.67ID:+99B24rl0 >>846
そのboard[x[][y]はゼロフィルしても良い配列?
盤外に飛び出す桂馬飛びの高速判定テクニックとして実はboard[-1][-2]が壁のコードになっている
とかありそう
※ 全くの想像です
※ 未定義動作と言われても知らそんこの場合アセンブリコードが正しくて速ければええんじゃ
※ この場合2次元配列はやめてカラム数が2のべきの1次元配列であるべき
※ ここまで全くの妄想です
そのboard[x[][y]はゼロフィルしても良い配列?
盤外に飛び出す桂馬飛びの高速判定テクニックとして実はboard[-1][-2]が壁のコードになっている
とかありそう
※ 全くの想像です
※ 未定義動作と言われても知らそんこの場合アセンブリコードが正しくて速ければええんじゃ
※ この場合2次元配列はやめてカラム数が2のべきの1次元配列であるべき
※ ここまで全くの妄想です
861デフォルトの名無しさん (ワッチョイ 5328-gB2L)
2022/12/26(月) 16:19:44.55ID:+99B24rl0 説明が抜けた;;;
board[-1][-2]が壁のコードになるような思想の場合は
board[0..][0..]にも当然盤を取り囲むように壁のコードが配置される
board[-1][-2]が壁のコードになるような思想の場合は
board[0..][0..]にも当然盤を取り囲むように壁のコードが配置される
862はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/26(月) 16:26:57.23ID:OBkbHJZM0863デフォルトの名無しさん (ブーイモ MM21-kjyB)
2022/12/26(月) 16:30:53.99ID:/571GBxYM864はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/26(月) 16:34:00.09ID:OBkbHJZM0865デフォルトの名無しさん (ブーイモ MM21-kjyB)
2022/12/26(月) 16:44:01.34ID:/571GBxYM >>864
前方宣言を許さない設計なんて本当にあるの?
前方宣言を許さない設計なんて本当にあるの?
866デフォルトの名無しさん (ワッチョイ 6d5f-aH43)
2022/12/26(月) 16:54:23.72ID:QSsdq8qk0 >>865 あるよ。標準ライブラリがそう。
867デフォルトの名無しさん (ワッチョイ ebda-w5mw)
2022/12/26(月) 16:55:15.06ID:zTKHQ8850 かまってちゃん
868はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/26(月) 16:55:21.28ID:OBkbHJZM0869デフォルトの名無しさん (ブーイモ MM21-kjyB)
2022/12/26(月) 17:07:33.78ID:/571GBxYM870デフォルトの名無しさん (ワッチョイ 5328-gB2L)
2022/12/26(月) 17:11:08.06ID:+99B24rl0 namespaceはシンボルの衝突を防ぐためのしくみなのに
後から要素を追加できる仕様の方がおかしいfinalizeできるべき
だいたいnamespace oresama にX=サンが "bar.h" にて void oresama:foo()を定義して、
C++の標準ライブラリ仕様しか見ていないY=サンが "baz.h" にて同じシグネチャで異なる実装の
void oresama:foo() が実装されてしまう危険性が避けられない
のだから第三者によるnamespace内への後付けは本来言われるまでも無く禁止されるべき事項、
同一シグネチャで異なる実装があったらリンク時にエラーになる、と気体することは場合に掘っては全くできない
http://0xcc.net/blog/archives/000060.html
ちなVS2010だともっと簡単に(スタティックリンクでも)起こせるorz
後から要素を追加できる仕様の方がおかしいfinalizeできるべき
だいたいnamespace oresama にX=サンが "bar.h" にて void oresama:foo()を定義して、
C++の標準ライブラリ仕様しか見ていないY=サンが "baz.h" にて同じシグネチャで異なる実装の
void oresama:foo() が実装されてしまう危険性が避けられない
のだから第三者によるnamespace内への後付けは本来言われるまでも無く禁止されるべき事項、
同一シグネチャで異なる実装があったらリンク時にエラーになる、と気体することは場合に掘っては全くできない
http://0xcc.net/blog/archives/000060.html
ちなVS2010だともっと簡単に(スタティックリンクでも)起こせるorz
871デフォルトの名無しさん (ワッチョイ 5328-gB2L)
2022/12/26(月) 17:13:25.25ID:+99B24rl0 訂正orz
誤1: C++の標準ライブラリ仕様しか見ていないY=サン
正1: oresamaのオリジナルの仕様書しか見ていないY=サン
誤2: 場合に掘っては全く
正2: 場合によっては全く
誤1: C++の標準ライブラリ仕様しか見ていないY=サン
正1: oresamaのオリジナルの仕様書しか見ていないY=サン
誤2: 場合に掘っては全く
正2: 場合によっては全く
872デフォルトの名無しさん (ブーイモ MM21-kjyB)
2022/12/26(月) 17:15:26.88ID:/571GBxYM873はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/26(月) 17:58:37.42ID:OBkbHJZM0 >>872
前方宣言自体はいいよ。
そのライブラリ内でどう定義されているかわかっていて**妥当な前方宣言を出来るなら**。
将来のライブラリの更新があっても妥当でありつづける (または妥当でなくなったときに追従する) なら。
いちいちライブラリが保証していない内部仕様を調査して妥当かどうか確かめなきゃならない、どんな干渉が起きるかわからない
ってのは (ライブラリの仕様としては) 未定義じゃろ。
前方宣言自体はいいよ。
そのライブラリ内でどう定義されているかわかっていて**妥当な前方宣言を出来るなら**。
将来のライブラリの更新があっても妥当でありつづける (または妥当でなくなったときに追従する) なら。
いちいちライブラリが保証していない内部仕様を調査して妥当かどうか確かめなきゃならない、どんな干渉が起きるかわからない
ってのは (ライブラリの仕様としては) 未定義じゃろ。
874デフォルトの名無しさん (スプッッ Sddb-tLuz)
2022/12/26(月) 18:28:18.27ID:gLGPMU9jd875デフォルトの名無しさん (ワッチョイ 1301-iijX)
2022/12/26(月) 18:40:09.55ID:+xP92Jxa0 >>846
C言語はboard[x][y]のy側が連続に配置されるから for(x = ...){ for(y = ...){ ... } } の順にネストした方が効率的になる可能性が高いので俺なら
for (x = 0; x < XMAX; x++){
for (y = 0; y < YMAX; y++){
board[x][y] = 0;
}
num[x] = 0;
}
って書くと思う
C言語はboard[x][y]のy側が連続に配置されるから for(x = ...){ for(y = ...){ ... } } の順にネストした方が効率的になる可能性が高いので俺なら
for (x = 0; x < XMAX; x++){
for (y = 0; y < YMAX; y++){
board[x][y] = 0;
}
num[x] = 0;
}
って書くと思う
876デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/26(月) 21:17:05.02ID:YnLWxzzl0877デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/26(月) 21:18:30.60ID:YnLWxzzl0878デフォルトの名無しさん (ワッチョイ cf7c-5mfr)
2022/12/26(月) 21:37:30.08ID:2gdEMUwk0 前方宣言のつもりがこういうので意味変わっても知らんぞ
http://d.hatena.ne.jp/DigitalGhost/20090216/1234793122
http://d.hatena.ne.jp/DigitalGhost/20090216/1234793122
879デフォルトの名無しさん (ブーイモ MM21-5fcg)
2022/12/26(月) 21:37:34.67ID:Luv0983hM oresama 名前空間に前方宣言が追加されると未定義動作になるような例って実際作れる?
std についてはコンパイラマジックでも何でもありだが
std についてはコンパイラマジックでも何でもありだが
880デフォルトの名無しさん (ワッチョイ f176-lg2t)
2022/12/26(月) 21:47:21.55ID:6ywYYiev0 未定義動作は未定義だよ
意図通り動いても、
デバッグするのに便利な例外が投げられても、
まともに動いてるように見えてメモリ壊してても、
コンパイルエラーになっても問題ない
コンパイラと実行環境は求められる動作が決まってないから
意図通り動いても、
デバッグするのに便利な例外が投げられても、
まともに動いてるように見えてメモリ壊してても、
コンパイルエラーになっても問題ない
コンパイラと実行環境は求められる動作が決まってないから
881デフォルトの名無しさん (スッププ Sd2b-daZ2)
2022/12/26(月) 22:12:49.76ID:NZGNd7w4d 変な宣言が追加されるとSFINAEが狂うパターンとかあるかも。
882デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/26(月) 23:28:38.90ID:8d7AMOhX0883デフォルトの名無しさん (ワッチョイ 7fbb-tgY1)
2022/12/26(月) 23:47:11.05ID:5EhwIIVK0 はちみつはもう冬休みなのか。裏山
885デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:01:58.89ID:QO3hLMTW0 >>820
思ったんだけどさ前方宣言は`declarations'に入ってないってことはないかな?
以下が原文なんだけども
>Unless otherwise specified, the behavior of a C++ program is undefined
>if it adds declarations or definitions to namespace std or to a
>namespace within namespace std.
文からは入ってるとも入ってないとも俺には判断がつかない
確かな見解がある人はいるかな?
思ったんだけどさ前方宣言は`declarations'に入ってないってことはないかな?
以下が原文なんだけども
>Unless otherwise specified, the behavior of a C++ program is undefined
>if it adds declarations or definitions to namespace std or to a
>namespace within namespace std.
文からは入ってるとも入ってないとも俺には判断がつかない
確かな見解がある人はいるかな?
886デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 00:11:56.45ID:9ztV+U0x0887デフォルトの名無しさん (ワッチョイ 6d5f-aH43)
2022/12/27(火) 00:13:15.81ID:fnhKiHjQ0 >>884 >859の言う「ダブルスタンダード」は>862-864で否定されて終わってるだろ。
889デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 00:16:20.11ID:9ztV+U0x0 >>888
ゴミめ
ゴミめ
890デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 00:18:30.98ID:9ztV+U0x0 ヘッダファイルそのものを改造することだってできる
ISO/IEC14882のヘッダファイルだけ改造しちゃいけなくて
それ以外のヘッダファイルは改造していいことにしたいのかよ
ダブスタだからって? バカか
ISO/IEC14882のヘッダファイルだけ改造しちゃいけなくて
それ以外のヘッダファイルは改造していいことにしたいのかよ
ダブスタだからって? バカか
891デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 00:20:13.94ID:9ztV+U0x0 標準のヘッダファイルを書き換えるななんてバカ用の説明が規格票の中に書いてあるかどうか知らんが
そういうレベルの屁理屈ならべてんなボケが
そういうレベルの屁理屈ならべてんなボケが
892デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:21:11.64ID:QO3hLMTW0893デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:22:43.58ID:QO3hLMTW0 >>889
3行目に書いてあるから読みなよ
3行目に書いてあるから読みなよ
894デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:23:47.05ID:QO3hLMTW0 >>890,891
何で標準のヘッダファイルを書き換える話を始めてるの?
何で標準のヘッダファイルを書き換える話を始めてるの?
895デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:28:00.93ID:QO3hLMTW0 >>820
>>>818
>原則としては std 名前空間になんらかの宣言や定義を追加したら未定義ということになってる。
>https://timsong-cpp.github.io/cppwp/n4861/namespace.std
>その事例も該当すると思う。
これが正しいかもしれんし違うかもしれん
>>>818
>原則としては std 名前空間になんらかの宣言や定義を追加したら未定義ということになってる。
>https://timsong-cpp.github.io/cppwp/n4861/namespace.std
>その事例も該当すると思う。
これが正しいかもしれんし違うかもしれん
896デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 00:33:27.20ID:9ztV+U0x0897デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 00:34:29.25ID:9ztV+U0x0898デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:36:22.67ID:QO3hLMTW0899デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 00:36:52.90ID:9ztV+U0x0 作者がするなということをなぜしたいんだよ
脱獄したきゃ勝手にやってろ
誰も止めやしねえよ
バカ一匹どうなろうが誰も知ったこっちゃねえ
脱獄したきゃ勝手にやってろ
誰も止めやしねえよ
バカ一匹どうなろうが誰も知ったこっちゃねえ
900デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:37:18.87ID:QO3hLMTW0901デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:41:27.03ID:QO3hLMTW0902デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 00:42:11.81ID:9ztV+U0x0 ああそうかい
勝手に思ってな
勝手に思ってな
903デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:43:47.73ID:QO3hLMTW0 >>902
規格は読んだのかな?
規格は読んだのかな?
904デフォルトの名無しさん (ワッチョイ 5328-gB2L)
2022/12/27(火) 00:47:28.29ID:R1/11RYB0905デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:49:39.31ID:QO3hLMTW0906デフォルトの名無しさん (ワッチョイ 5328-gB2L)
2022/12/27(火) 00:50:13.48ID:R1/11RYB0 「勝手に」が抜けてたorz
X=サンが*勝手*に追加した "bar.h" にて void oresama:foo()を定義のを知らずに
Y=サンが "baz.h" にて同じシグネチャで異なる実装の void oresama:foo() が実装されてしまう
と言う場合は覿面に意図しない動きになる(ことがある
X=サンが*勝手*に追加した "bar.h" にて void oresama:foo()を定義のを知らずに
Y=サンが "baz.h" にて同じシグネチャで異なる実装の void oresama:foo() が実装されてしまう
と言う場合は覿面に意図しない動きになる(ことがある
907デフォルトの名無しさん (ワッチョイ 5328-gB2L)
2022/12/27(火) 00:51:22.27ID:R1/11RYB0 >>905
定義の無い前方宣言とか何のためにするんじゃ……
定義の無い前方宣言とか何のためにするんじゃ……
908デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:53:18.15ID:QO3hLMTW0909デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:54:50.91ID:QO3hLMTW0910デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 00:54:51.28ID:9ztV+U0x0911デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:56:18.99ID:QO3hLMTW0912デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 00:58:30.57ID:9ztV+U0x0 >>911
前方宣言て何? JIS X3014の規格票を検索してもヒットしないんだが
前方宣言て何? JIS X3014の規格票を検索してもヒットしないんだが
913デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 00:59:25.89ID:QO3hLMTW0 forward declarationじゃないかな? ない?
914デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 01:03:39.45ID:9ztV+U0x0 さあ知らんね
おまえの曖昧さを俺が処理してやる義理はない
おまえの曖昧さを俺が処理してやる義理はない
915デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 01:06:05.88ID:9ztV+U0x0 技術板で煽りネタが英語力とかくだらんな
英語圏在住のバカと同類だってアピールしたら格好いいんかよw
英語圏在住のバカと同類だってアピールしたら格好いいんかよw
916デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 01:08:38.87ID:QO3hLMTW0917デフォルトの名無しさん (ワッチョイ a1c2-dmhP)
2022/12/27(火) 01:12:56.49ID:9ztV+U0x0 煽っても無駄だよ
義理のないことの特別サービスをさせたいようだが
世の中そう甘くはない
暇人と違って明日も朝から仕事なんだよ
バイバイ
義理のないことの特別サービスをさせたいようだが
世の中そう甘くはない
暇人と違って明日も朝から仕事なんだよ
バイバイ
918デフォルトの名無しさん (ワッチョイ b101-jXNG)
2022/12/27(火) 01:14:43.51ID:QO3hLMTW0919はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/27(火) 01:34:54.20ID:G9AKlNLO0 前方宣言が宣言でない可能性なんて考えたこともなかったが
たとえば単にポインタと書いてあるときにメンバ関数ポインタを含んでなかったりすることを
思い出せば変な用語になってる可能性は考慮にいれるという姿勢は必要かもしれない。
あらためて検討してみたところ、前方宣言という用語の直接的な定義はないが仕様中で
前方宣言 (forward declaration) と呼ばれているものは宣言に該当するし、
単に宣言の位置が前方である宣言のことを前方宣言と呼んでいると解しても良いと思う。
たとえば単にポインタと書いてあるときにメンバ関数ポインタを含んでなかったりすることを
思い出せば変な用語になってる可能性は考慮にいれるという姿勢は必要かもしれない。
あらためて検討してみたところ、前方宣言という用語の直接的な定義はないが仕様中で
前方宣言 (forward declaration) と呼ばれているものは宣言に該当するし、
単に宣言の位置が前方である宣言のことを前方宣言と呼んでいると解しても良いと思う。
920デフォルトの名無しさん (ワッチョイ 5b10-WyE/)
2022/12/27(火) 02:38:42.00ID:Kk7zAeAV0 未定義動作だから宣言禁止してるんじゃない
宣言禁止してるから未定義動作になったんだ
宣言禁止してるから未定義動作になったんだ
921デフォルトの名無しさん (ワッチョイ 6d5f-aH43)
2022/12/27(火) 02:48:53.38ID:fnhKiHjQ0 >>892
>865の質問は>866,868で答えが出てて、その前の話に影響無いし・・・と読み進めると
>872で「前方宣言は規格で合法」とかいう当たり前に見える意味不明な話につづいており・・・
どうも>859以降の「合法」が↓のようなよくある解釈とは違うようであることに気付いた。
https://cpprefjp.github.io/implementation-compliance.html
> 合法 (legal)・違法 (illegal): これらの語はプログラムに対しても慣用されるが、具体的な意味は明確でない。 プログラムの正しさには複数の水準があるためである。 適格、またはすべての規則を満たす、または未定義の動作を含まないなどが考えられる。
明確な言葉で言い換えられるまで下手に考えても不毛そう。
「前方宣言は」というのも「ユーザー側コードに~な前方宣言を加えて利用していた場合にライブラリ更新があっても~」
とかいう意味になりそうだけど端折りすぎて意味不明になってる。
「鼻から悪魔」は未定義動作と同じ意味のつもりで使ってそうだけどコンパイルエラーやリンクエラーは除くようでもあり
これも未定義動作とは違う何か。
さっきキレちらかしてた人もこんな感じで我慢できなくなったんだろう。
明確な用語を使うように気を付けて主張を整理しないと、君とまともに会話してくれる人居なくなると思うよ。
>865の質問は>866,868で答えが出てて、その前の話に影響無いし・・・と読み進めると
>872で「前方宣言は規格で合法」とかいう当たり前に見える意味不明な話につづいており・・・
どうも>859以降の「合法」が↓のようなよくある解釈とは違うようであることに気付いた。
https://cpprefjp.github.io/implementation-compliance.html
> 合法 (legal)・違法 (illegal): これらの語はプログラムに対しても慣用されるが、具体的な意味は明確でない。 プログラムの正しさには複数の水準があるためである。 適格、またはすべての規則を満たす、または未定義の動作を含まないなどが考えられる。
明確な言葉で言い換えられるまで下手に考えても不毛そう。
「前方宣言は」というのも「ユーザー側コードに~な前方宣言を加えて利用していた場合にライブラリ更新があっても~」
とかいう意味になりそうだけど端折りすぎて意味不明になってる。
「鼻から悪魔」は未定義動作と同じ意味のつもりで使ってそうだけどコンパイルエラーやリンクエラーは除くようでもあり
これも未定義動作とは違う何か。
さっきキレちらかしてた人もこんな感じで我慢できなくなったんだろう。
明確な用語を使うように気を付けて主張を整理しないと、君とまともに会話してくれる人居なくなると思うよ。
922デフォルトの名無しさん (ワッチョイ cf7c-5mfr)
2022/12/27(火) 07:37:18.96ID:GSvWJ+1+0 「天才のぼくちんの完璧なレスを理解できない無能なお前らが悪い!」って暴れ出すいつもの奴だからもう放っとけよ
923デフォルトの名無しさん (ワッチョイ 07cf-4Ar3)
2022/12/27(火) 07:46:03.70ID:nX/ozHbV0 事実と挙動だけ書けばいい
924デフォルトの名無しさん (スプッッ Sddb-tLuz)
2022/12/27(火) 08:04:36.52ID:l/ni+ylad ハッシュ小僧か
925デフォルトの名無しさん (ワッチョイ b101-JhXQ)
2022/12/27(火) 11:12:03.63ID:QO3hLMTW0926デフォルトの名無しさん (ワッチョイ b101-JhXQ)
2022/12/27(火) 11:18:29.54ID:QO3hLMTW0927デフォルトの名無しさん (スプッッ Sdaf-tLuz)
2022/12/27(火) 11:39:33.69ID:2fUOYjFgd はいはい、別人なんでちゅね~
ニヤニヤ
ニヤニヤ
928デフォルトの名無しさん (ワッチョイ b101-JhXQ)
2022/12/27(火) 11:43:36.77ID:QO3hLMTW0929デフォルトの名無しさん (スプッッ Sdaf-tLuz)
2022/12/27(火) 11:44:56.74ID:2fUOYjFgd それでそれで?
930デフォルトの名無しさん (ワッチョイ b101-JhXQ)
2022/12/27(火) 11:45:14.64ID:QO3hLMTW0 おんなじワッチョイ検索してね
931デフォルトの名無しさん (ワッチョイ 6d5f-aH43)
2022/12/27(火) 11:45:28.77ID:fnhKiHjQ0 「いつもの奴」が一人ということも無いからな。悲しいことに。
コテハン付けてくれない?
コテハン付けてくれない?
932デフォルトの名無しさん (ワッチョイ b101-JhXQ)
2022/12/27(火) 11:46:04.33ID:QO3hLMTW0 天才くんほどの実力はないです
933デフォルトの名無しさん (ワッチョイ b101-JhXQ)
2022/12/27(火) 11:46:30.13ID:QO3hLMTW0 >>931
どうやってつけるの?
どうやってつけるの?
934デフォルトの名無しさん (ワッチョイ 6d5f-aH43)
2022/12/27(火) 11:58:22.17ID:fnhKiHjQ0936デフォルトの名無しさん (ブーイモ MM21-5fcg)
2022/12/27(火) 12:03:58.07ID:ifNnQS7gM >>837
本題と関係ないけどこれって CTAD 関連含めて挙動完全に大丈夫なんか?少なくとも C++17 ではダメだが
本題と関係ないけどこれって CTAD 関連含めて挙動完全に大丈夫なんか?少なくとも C++17 ではダメだが
937天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 12:04:16.27ID:QO3hLMTW0 俺は天才なんて呼ばれたことはないが
天才と呼ばれた人だこのスレで呼ばれたw
天才と呼ばれた人だこのスレで呼ばれたw
938天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 12:04:54.10ID:QO3hLMTW0 天才と呼ばれた人だ<と>このスレで呼ばれたw
939デフォルトの名無しさん (ワッチョイ 6d5f-aH43)
2022/12/27(火) 12:12:33.94ID:fnhKiHjQ0 ありがとうございます。助かります。
940天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 12:13:50.33ID:QO3hLMTW0 いえこちらこそ
941デフォルトの名無しさん (スッップ Sd57-Xl/E)
2022/12/27(火) 12:17:08.49ID:XYKyOOkrd942天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 12:29:08.28ID:QO3hLMTW0943デフォルトの名無しさん (スッップ Sd57-Xl/E)
2022/12/27(火) 12:55:07.85ID:XYKyOOkrd まずあなたがどっちもdeclarationなのにただのテクニックである前方宣言が含まれない理由を示すべきだろう
944天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 13:01:14.48ID:QO3hLMTW0945デフォルトの名無しさん (スップ Sd03-4fWv)
2022/12/27(火) 13:09:43.62ID:WVVp8u06d946デフォルトの名無しさん (スプッッ Sddb-FNX1)
2022/12/27(火) 13:10:56.66ID:8Y7pY2Mbd それは違うだろ
947デフォルトの名無しさん (スップ Sd03-4fWv)
2022/12/27(火) 13:18:26.61ID:WVVp8u06d 違わないよ
何でも起こりうるのが未定義動作だ
お前はコンパイルエラーの方が鼻悪魔出現よりも非現実度が高いと思ってるの?
何でも起こりうるのが未定義動作だ
お前はコンパイルエラーの方が鼻悪魔出現よりも非現実度が高いと思ってるの?
948天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 13:19:13.33ID:QO3hLMTW0949デフォルトの名無しさん (スップ Sd03-4fWv)
2022/12/27(火) 13:22:50.11ID:WVVp8u06d 現実的な話としては、未定義動作静的解析で見つけ出してillーformed扱いしてコンパイル拒否するコンパイラがあったとして、それは規格違反ではない
当たり前だろ、だって未定義なんだから
当たり前だろ、だって未定義なんだから
950デフォルトの名無しさん (スッップ Sd57-Xl/E)
2022/12/27(火) 13:23:40.85ID:XYKyOOkrd951デフォルトの名無しさん (スップ Sd03-4fWv)
2022/12/27(火) 13:24:42.77ID:WVVp8u06d >>948
未定義動作の「動作」(undefined behaviourのbehaviour)は実行時動作だけ意味してるわけじゃない
未定義動作の「動作」(undefined behaviourのbehaviour)は実行時動作だけ意味してるわけじゃない
952天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 13:27:30.62ID:QO3hLMTW0953天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 13:35:30.55ID:QO3hLMTW0 >>951
初めて聞いたよ
初めて聞いたよ
954デフォルトの名無しさん (スプッッ Sddb-FNX1)
2022/12/27(火) 13:35:53.60ID:8Y7pY2Mbd955デフォルトの名無しさん (スップ Sd03-4fWv)
2022/12/27(火) 13:43:49.52ID:WVVp8u06d956天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 13:44:55.47ID:QO3hLMTW0 ソースがWikipediaで申し訳ないが
未定義動作とはコンパイルやリンクを通るものを言う
https://ja.wikipedia.org/wiki/%E6%9C%AA%E5%AE%9A%E7%BE%A9%E5%8B%95%E4%BD%9C
名前空間stdにビルドできるコードを追加しても
動作が意図通りになるか分からんよ
動作は未定義だよってのが>>820の指摘だよ
未定義動作とはコンパイルやリンクを通るものを言う
https://ja.wikipedia.org/wiki/%E6%9C%AA%E5%AE%9A%E7%BE%A9%E5%8B%95%E4%BD%9C
名前空間stdにビルドできるコードを追加しても
動作が意図通りになるか分からんよ
動作は未定義だよってのが>>820の指摘だよ
957デフォルトの名無しさん (スプッッ Sddb-FNX1)
2022/12/27(火) 13:46:12.79ID:8Y7pY2Mbd 未定義じゃなくても「必ず通らなきゃならない」なんて記述はないと思うけど
958デフォルトの名無しさん (ワッチョイ 6d5f-aH43)
2022/12/27(火) 13:56:51.44ID:fnhKiHjQ0959デフォルトの名無しさん (スッップ Sd57-Xl/E)
2022/12/27(火) 13:57:29.46ID:XYKyOOkrd960デフォルトの名無しさん (スップ Sd03-4fWv)
2022/12/27(火) 13:59:01.95ID:WVVp8u06d961デフォルトの名無しさん (ワッチョイ 6d5f-aH43)
2022/12/27(火) 13:59:36.79ID:fnhKiHjQ0962はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/27(火) 14:01:35.95ID:G9AKlNLO0 >>956
仕様上の定義では未定義の挙動は翻訳中にも生じる。
> https://timsong-cpp.github.io/cppwp/n4861/defns.undefined
> during translation or program execution
仕様上の定義では未定義の挙動は翻訳中にも生じる。
> https://timsong-cpp.github.io/cppwp/n4861/defns.undefined
> during translation or program execution
963天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 14:23:44.32ID:QO3hLMTW0964デフォルトの名無しさん (ワッチョイ cf9c-iijX)
2022/12/27(火) 14:42:36.98ID:kLAEuBfs0 >>956
未定義動作はc++標準の規定外というだけで、エラーになるかどうかは全く関係無い。エラーにしてもエラーにしなくてもc++標準には違反しない。
www.open-std.org/jtc1/sc22/wg21/docs/standards
N4849.
3.28 未定義の動作
この文書が要求していない動作
[項目への注記 1: 未定義の動作は,この文書が動作の明示的な定義を省略したとき,又はプログラムが誤った構成又は誤ったデータを使用したときに予想されるかもしれない。
未定義動作は,この文書が動作の明示的な定義を省略した場合又はプログラムが誤った構成若しくは誤ったデータを使用した場合に想定される。許容される未定義の動作
予測できない結果をもたらす状況の完全な無視から、翻訳中またはプログラム実行中に特徴的な文書化された方法で動作することまで、許容される未定義動作の範囲があります。
環境に応じて文書化された方法でプログラムの実行を行う(診断メッセージの発行の有無は問わない)。
また、翻訳や実行を終了する(診断メッセージを発行する)こともあります。)
多くの誤ったプログラム構成は、未定義の動作を発生させるものではなく、診断が必要なものである。
定数式の評価は、本書第 4 条から第 15 条で明示的に未定義と指定された動作にはならない。
から第15項(7.7)までに明示的に未定義と指定された動作を示すことはない。- エンディングノート]
未定義動作はc++標準の規定外というだけで、エラーになるかどうかは全く関係無い。エラーにしてもエラーにしなくてもc++標準には違反しない。
www.open-std.org/jtc1/sc22/wg21/docs/standards
N4849.
3.28 未定義の動作
この文書が要求していない動作
[項目への注記 1: 未定義の動作は,この文書が動作の明示的な定義を省略したとき,又はプログラムが誤った構成又は誤ったデータを使用したときに予想されるかもしれない。
未定義動作は,この文書が動作の明示的な定義を省略した場合又はプログラムが誤った構成若しくは誤ったデータを使用した場合に想定される。許容される未定義の動作
予測できない結果をもたらす状況の完全な無視から、翻訳中またはプログラム実行中に特徴的な文書化された方法で動作することまで、許容される未定義動作の範囲があります。
環境に応じて文書化された方法でプログラムの実行を行う(診断メッセージの発行の有無は問わない)。
また、翻訳や実行を終了する(診断メッセージを発行する)こともあります。)
多くの誤ったプログラム構成は、未定義の動作を発生させるものではなく、診断が必要なものである。
定数式の評価は、本書第 4 条から第 15 条で明示的に未定義と指定された動作にはならない。
から第15項(7.7)までに明示的に未定義と指定された動作を示すことはない。- エンディングノート]
965天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 14:53:01.92ID:QO3hLMTW0966デフォルトの名無しさん (スッップ Sd57-Xl/E)
2022/12/27(火) 15:32:40.76ID:XYKyOOkrd stdだと未定義とするって仕様なのにstd保留してどうするんだ
未定義にならずにコンパイラが仕様通りの解釈して動作するだけだろ
未定義にならずにコンパイラが仕様通りの解釈して動作するだけだろ
967はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/27(火) 15:37:36.05ID:G9AKlNLO0 言語的には仕様通りの解釈をするがそれがそのライブラリにとって想定外であるような、
つまり本来の動作と異なる結果を引きおこすような形での前方宣言がありうるかという意味だろ。
つまり本来の動作と異なる結果を引きおこすような形での前方宣言がありうるかという意味だろ。
968はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/27(火) 15:58:07.39ID:G9AKlNLO0 それっぽい例を作れた!
https://wandbox.org/permlink/6utNhLox1WhOaBV8
とはいっても適切な前方宣言になっていないから起こっていることではあるので、
「ヘッダを見て間違いなく前方宣言としては適切になるように書いたけど挙動には影響ある」という例にはなってない。
https://wandbox.org/permlink/6utNhLox1WhOaBV8
とはいっても適切な前方宣言になっていないから起こっていることではあるので、
「ヘッダを見て間違いなく前方宣言としては適切になるように書いたけど挙動には影響ある」という例にはなってない。
969天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 16:01:30.79ID:QO3hLMTW0970デフォルトの名無しさん (ワッチョイ 73f0-4Ar3)
2022/12/27(火) 19:17:57.55ID:7IKxcRBS0 じゃ小学生の自由研究の時期が終わったら呼んでください
971デフォルトの名無しさん (ワッチョイ 95da-Axul)
2022/12/27(火) 20:34:13.81ID:AOBUz6/T0 ボクちゃんの痛い自由研究
「stdネームスペースに落書き」
「stdネームスペースに落書き」
972デフォルトの名無しさん (ワッチョイ 8d01-s0Sd)
2022/12/27(火) 21:38:26.75ID:Q5qxYeje0 じゃあ、ISOで未定義の時は、コンパイラの仕様を調べて使えば良いのでは?
973デフォルトの名無しさん (ササクッテロロ Spa9-Ij4T)
2022/12/27(火) 21:40:51.41ID:FdHzEXmap 移植とかでコンパイラ変わったら意図しない実行するとか平気ならな
974天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 22:06:21.35ID:QO3hLMTW0975天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 22:15:15.29ID:QO3hLMTW0 >>972,973
俺は絶対にstdはいじらないね
俺は絶対にstdはいじらないね
976デフォルトの名無しさん (ワッチョイ 8d01-s0Sd)
2022/12/27(火) 22:17:12.44ID:Q5qxYeje0 じゃあ俺もそうする。
977デフォルトの名無しさん (ワッチョイ 97ad-dxp0)
2022/12/27(火) 22:18:07.71ID:xkGd3ITG0 自作クラスでendlなどのマニピュレータをオーバーライドするにはstd名前空間に入れるしかないじゃない?
978デフォルトの名無しさん (ワッチョイ 5b10-WyE/)
2022/12/27(火) 22:19:58.45ID:Kk7zAeAV0 つうかstdが「標準である」と言う設計上前方宣言を禁止したから仕様上未定義動作となっただけの話で
危険だから前方宣言すべきじゃないって話じゃないと思うよ
結果的にコンパイラ側がそれを逆手にとって最適化とか推し進めた形になったとしてもね
前方宣言許さない仕様のライブラリって言うのは危険だからじゃなく
勝手に拡張すること許さないと決めたライブラリであるというだけの話で
危険だから前方宣言すべきじゃないって話じゃないと思うよ
結果的にコンパイラ側がそれを逆手にとって最適化とか推し進めた形になったとしてもね
前方宣言許さない仕様のライブラリって言うのは危険だからじゃなく
勝手に拡張すること許さないと決めたライブラリであるというだけの話で
979デフォルトの名無しさん (ワッチョイ 8d01-s0Sd)
2022/12/27(火) 22:24:30.48ID:Q5qxYeje0980天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/27(火) 22:55:56.41ID:QO3hLMTW0 随分と古参なんですね
981デフォルトの名無しさん (ワッチョイ 95da-Axul)
2022/12/27(火) 23:15:16.94ID:AOBUz6/T0 >>977
バカが設計したからなアレ
バカが設計したからなアレ
982デフォルトの名無しさん (ワッチョイ 9fea-ij7E)
2022/12/27(火) 23:26:06.87ID:VvvSD8wK0 ostream と istream の別の建てつけなので、ファイルポインタもこの二つのクラスで別なんだろうと思っていたら、土壇場で、実はファイルポインタは共有していましたぁ
とか勘弁してほしいと痛切におもいましたねえ
とか勘弁してほしいと痛切におもいましたねえ
983デフォルトの名無しさん (ブーイモ MM21-5fcg)
2022/12/27(火) 23:28:14.07ID:2qRZfHzrM >>968
これ面白いな
これ面白いな
984天災 ◆41t0I.PYBW0z (ワッチョイ b101-jXNG)
2022/12/28(水) 00:50:07.21ID:YU/L8pIp0 無名namespaceで囲ってるとこが変態
985デフォルトの名無しさん (テテンテンテン MM97-iijX)
2022/12/28(水) 08:09:55.49ID:jVoOqLVQM >>978
そういうのは「改造c++」とでも言うべきもので、個々の具体的な実装を挙げて話すべき話題。
具体的な実装の無い「改造c++」なんて「オレ言語」でしかないから、話題にしても相手にするヤツは居ないよ。興味無い。
そういうのは「改造c++」とでも言うべきもので、個々の具体的な実装を挙げて話すべき話題。
具体的な実装の無い「改造c++」なんて「オレ言語」でしかないから、話題にしても相手にするヤツは居ないよ。興味無い。
986デフォルトの名無しさん (アウアウウー Sa1f-SHOq)
2022/12/28(水) 16:02:37.97ID:wx2BQ76Ga >>981
まさかプロトタイプが30年後も使い続けてるとは思わなかったんだよ
まさかプロトタイプが30年後も使い続けてるとは思わなかったんだよ
987はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6d3e-aH43)
2022/12/29(木) 22:47:04.14ID:J2+EgPHK0 >>974
「わからない」という状態が最大のリスクだ。 精査して事情を把握してからやる分にはいいよ。
だけど少なくとも私はいちいちライブラリの細かいことなんて調べたくないし、
細部の事情まで読み解ける自信はないから製作者の意図 (仕様として明示されている範囲) を超える
ような使い方をあえてすることはないだろうという話。 要するに割に合わない。
しなくていいことはせずに済ませられたらそのほうがいいだろ。
割に合うと考えている人がいたとしたら
「んなわけねーだろ。 お前が調べるのに労力をかけてないだけ」
と思うから安易にやっちゃうやつはちょっとナメてるように感じる。
そりゃあ他に打てる手がなければ割に合わなくてもやらざるを得ないことだってあるだろうけどさぁ。
「わからない」という状態が最大のリスクだ。 精査して事情を把握してからやる分にはいいよ。
だけど少なくとも私はいちいちライブラリの細かいことなんて調べたくないし、
細部の事情まで読み解ける自信はないから製作者の意図 (仕様として明示されている範囲) を超える
ような使い方をあえてすることはないだろうという話。 要するに割に合わない。
しなくていいことはせずに済ませられたらそのほうがいいだろ。
割に合うと考えている人がいたとしたら
「んなわけねーだろ。 お前が調べるのに労力をかけてないだけ」
と思うから安易にやっちゃうやつはちょっとナメてるように感じる。
そりゃあ他に打てる手がなければ割に合わなくてもやらざるを得ないことだってあるだろうけどさぁ。
988デフォルトの名無しさん (ワッチョイ ebda-w5mw)
2022/12/30(金) 07:37:06.73ID:zn+Ud9N00 本当に余計なお世話だけど、はちみつさんのような実力がある人は
むしろライブラリやコンパイラのソースを読んだ方がいいよ
むしろライブラリやコンパイラのソースを読んだ方がいいよ
989デフォルトの名無しさん (アウアウウー Sa71-CBJz)
2022/12/30(金) 10:24:58.07ID:O3GOnLRpa >>988
おまえは仕事した方がいい
おまえは仕事した方がいい
990デフォルトの名無しさん (オッペケ Srd9-RwwO)
2022/12/30(金) 11:11:02.33ID:l10vdbnHr 火の玉ストレートやめたれ
991デフォルトの名無しさん (ワッチョイ 5328-gB2L)
2022/12/30(金) 13:31:38.92ID:p0azBXIn0 std名前空間への勝手要素追加は未定義動作と書かれているのに
std名前空間内のクラスへのメンバ追加についてはなんで言及が無いのやろうな……
名前空間もクラスもPGの責任分担範囲の区切りみたいなもんで、
第三者に後から勝手に弄られたら設計したPGが困るのは同じだと思うのだけど、
std名前空間内のクラスへのメンバ追加についてはなんで言及が無いのやろうな……
名前空間もクラスもPGの責任分担範囲の区切りみたいなもんで、
第三者に後から勝手に弄られたら設計したPGが困るのは同じだと思うのだけど、
992デフォルトの名無しさん (ワッチョイ 95da-Axul)
2022/12/30(金) 13:33:22.64ID:DPUEZfMS0 後々の事考えて設計出来ない奴はPGに向いてない
993デフォルトの名無しさん (ワッチョイ 5328-gB2L)
2022/12/30(金) 14:02:10.34ID:p0azBXIn0 自分はできるPGですと自己申告する>>992……
その自身がどこから来るのかは誰も知らない……
その自身がどこから来るのかは誰も知らない……
994デフォルトの名無しさん (ワッチョイ 95da-Axul)
2022/12/30(金) 14:11:57.62ID:DPUEZfMS0 そんなこと思ってない
いままで見てきた汚いソース書いている連中の総意点を述べているだけのこと
いままで見てきた汚いソース書いている連中の総意点を述べているだけのこと
995デフォルトの名無しさん (ワッチョイ 5328-gB2L)
2022/12/30(金) 14:28:22.93ID:p0azBXIn0 つまりstd名前空間のソースは汚いから
予防のためにstd名前空間への勝手要素追加は未定義動作とするのがstdを設計したPGの立場では当然だと、
予防のためにstd名前空間への勝手要素追加は未定義動作とするのがstdを設計したPGの立場では当然だと、
996デフォルトの名無しさん (ワッチョイ 95da-Axul)
2022/12/30(金) 14:33:46.74ID:DPUEZfMS0 バカなの?
なんのための名前空間なのかよく考えろよ
設計を区分するためだろ
そこにお前みたいなワケワケな奴が落書きしたらめちゃくちゃになるだろ
なんのための名前空間なのかよく考えろよ
設計を区分するためだろ
そこにお前みたいなワケワケな奴が落書きしたらめちゃくちゃになるだろ
997デフォルトの名無しさん (ワッチョイ 07cf-4Ar3)
2022/12/30(金) 15:06:36.37ID:uGEPy//I0 stackoverflow 辺りで
皆さんの御意見を聞いて来いよw
皆さんの御意見を聞いて来いよw
998デフォルトの名無しさん (ワッチョイ 97ad-dxp0)
2022/12/30(金) 17:36:57.79ID:oiKCiiXa0 後のこと考えて設計するよりも先に手が動くような人じゃないとプログラミングは上達しないよ
999デフォルトの名無しさん (アウアウウー Sa71-CBJz)
2022/12/30(金) 17:55:02.39ID:12nE7t5Ga1000デフォルトの名無しさん (スプッッ Sddb-tLuz)
2022/12/30(金) 18:20:10.37ID:2kXrfTwwd 昔はさ、ウォーターフォールといって
完璧な設計ができるまでコードに手を出すな
設計が決まったら黙ってそれに従うコードを書け
なんてのがあったけど
前例のないものの完璧な設計なんてほいっとできるのか
現場からのフィードバックを無視なんてできるのか
って反省から今時の方法論ができているわけで
ただし、それを悪用するだけの寄生虫を擁護はしない
完璧な設計ができるまでコードに手を出すな
設計が決まったら黙ってそれに従うコードを書け
なんてのがあったけど
前例のないものの完璧な設計なんてほいっとできるのか
現場からのフィードバックを無視なんてできるのか
って反省から今時の方法論ができているわけで
ただし、それを悪用するだけの寄生虫を擁護はしない
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 60日 3時間 50分 35秒
新しいスレッドを立ててください。
life time: 60日 3時間 50分 35秒
10021002
Over 1000Thread 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 【文春】永野芽郁(25)&田中圭(40)燃え上がる不倫LINE ★19 [Ailuropoda melanoleuca★]
- 永野芽郁「一部報道にあるやり取りはしていない」所属事務所が「本人に確認」改めて「交際等の事実はない」★6 [muffin★]
- 【栃木】全生徒が徹夜で歩く85キロ強歩→35キロに短縮 大田原高校の伝統行事、負担増で [ぐれ★]
- 刃物を持った人物暴れた けが人の情報も”東京メトロ南北線 [少考さん★]
- 【米】スーパーのコメ価格、4233円 17週連続値上がり 前年同期比で2145円高く ★2 [ぐれ★]
- 【文春】田中圭と永野芽郁やりとりに「スクショはないの?」「信憑性が…」証拠となるはずのLINE画像が公開されない理由とは [muffin★]
- 【実況】博衣こよりのえちえちロックマンX8🧪
- 【実況】博衣こよりのえちえちロックマンX7🧪
- 【悲報】ワンルームマンションに普通に6年間住んだ結果、退去費用75万円請求されてしまう [126042664]
- 【動画】中国、エチで天才的なゲームを開発してしまう… [306119931]
- 会社辞めるね(´・ω・`)
- 東大前ジョーカー戸田佳孝容疑者の御尊顔 [377482965]