[過去ログ] C++相談室 part137 (953レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1(2): (ワッチョイ 12c3-4saf) 2018/08/27(月)16:02 ID:vY3QDx2y0(1/2) AAS
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part137
省11
873: (ワッチョイ 9f02-aemA) 2018/10/01(月)17:40 ID:qsdLJDx40(1/6) AAS
元はといえば禿が左辺値参照でもconstつければ右辺値を指せるという曲がった話を始めたのが
評判悪くてC++11でやっとやっとやっとやっとメスが入ったのが本当の理由
874(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/10/01(月)18:05 ID:hbafP85H0(1) AAS
>>872
色んな話題が出てるので混乱してるが、ムーブ不要論を出してる側の *元々の* 主張は >>846 の通り
「ちゃんとした所有権の管理 (たぶん Rust みたいなやつのこと?) が有りさえすれば」
であって、でもそれは C++ ではもはや無理でしょということもわかった上だと思う。
875: (ワッチョイ f7c3-2BxS) 2018/10/01(月)18:05 ID:Gge6W+rt0(1/5) AAS
Cにも欲しいわ
Cは参照ないから右辺値指示ポインタで
876: (ワッチョイ 9f02-aemA) 2018/10/01(月)18:09 ID:qsdLJDx40(2/6) AAS
それを言うなら、右辺値の概念を撤廃すべきでしょ
どんな値もポインタで指すことができ、
ポインタで指すことでregister指定を解除されるという変更
877: (ワッチョイ 1704-ClIk) 2018/10/01(月)18:12 ID:UY4lJdAP0(1) AAS
テンポラリーオブジェクトなくすと、一回必ず厳密に生成してから仕様になるので、手間増えると思う。
878(1): (ワッチョイ f7c3-2BxS) 2018/10/01(月)18:40 ID:Gge6W+rt0(2/5) AAS
右辺値がないと int i = 0; すら書けなくなるんだが
879(1): (ワッチョイ 9f02-aemA) 2018/10/01(月)18:50 ID:qsdLJDx40(3/6) AAS
なんで?
int j;
j ^= j;
int i = j;
左辺値でも問題ないじゃん
880: (オイコラミネオ MM4f-IJfJ) 2018/10/01(月)18:54 ID:xwh6ZD/vM(1/2) AAS
>>879
苦しいねーw
881(1): (ワッチョイ 77e3-c2ki) 2018/10/01(月)19:00 ID:Yquio+NL0(1/2) AAS
0 以外はどうすんの。
882: (ワッチョイ f7c3-2BxS) 2018/10/01(月)19:02 ID:Gge6W+rt0(3/5) AAS
> j ^= j;
はい未初期化値を使ったから未定義動作で鼻から悪魔
883(1): (ワッチョイ 77e3-c2ki) 2018/10/01(月)19:04 ID:Yquio+NL0(2/2) AAS
char buf[1];
int i = (int)(buf[10] - buf[0]);
で、i = 10 に初期化される。
884: (オイコラミネオ MM4f-IJfJ) 2018/10/01(月)19:05 ID:xwh6ZD/vM(2/2) AAS
NaNのときはxorは未定義か、そこまで考えなかったな
885(1): (ワッチョイ 9f7c-c2ki) 2018/10/01(月)19:06 ID:uXaVofwo0(1) AAS
>>883
間違った。正しくは:
char buf[1];
int i = (int)(&buf[10] - &buf[0]); // i = 10 と等価。
886: (ワッチョイ bf9f-e6iu) 2018/10/01(月)19:11 ID:rJND5eoS0(1/2) AAS
そもそも=の無理やりなオーバーロードや引数に対する暗黙的なattainが問題なんだろう。
しかし元々のcのシンタックスを引き継ぎつつ、上記の問題を解決するのは不可能。
887: (ワッチョイ f7c3-2BxS) 2018/10/01(月)19:14 ID:Gge6W+rt0(4/5) AAS
>>885
10
0
&buf[10]
&buf[0]
&buf[10] - &buf[0]
(int)(&buf[10] - &buf[0])
省2
888: (ワッチョイ 9f02-aemA) 2018/10/01(月)19:19 ID:qsdLJDx40(4/6) AAS
>>881
別に?
int *j;
j = &10;
int i = *j;
てだけじゃん
10が左辺値だったらって話ね
省4
889(1): (ワッチョイ f7c3-2BxS) 2018/10/01(月)19:23 ID:Gge6W+rt0(5/5) AAS
10が左辺値ならこれ認めるの?
10 = 42;
890(1): (ワッチョイ 574e-2bq/) 2018/10/01(月)21:57 ID:92NEoPQV0(1) AAS
お前らがC++で作ったことあるものリスト化して
891: (ワッチョイ 9f02-aemA) 2018/10/01(月)22:37 ID:qsdLJDx40(5/6) AAS
>>889
全然かまわん
int a = 10;
int b = 10;
a = 42;
こう言っているに過ぎない
892: (ワッチョイ 9f02-aemA) 2018/10/01(月)22:42 ID:qsdLJDx40(6/6) AAS
>>878
そろそろ答えてもらおうか
なぜ右辺値がないと int i = 0; が書けないのか
893: (ワッチョイ 9fbd-G9Ql) 2018/10/01(月)23:15 ID:2m3Ms8fl0(1/3) AAS
>>874
ていうか所有権などという中途半端な概念にオブジェクトの解放を担わせるのは危険か無意味かのどっちかにしかならない
最後までオブジェクトを使いたい人と、そのオブジェクトを所有する人を
コードに所有権を明示するスタイルで一致させられるケースは少ない
希ガス
894(2): (ワッチョイ 9fbd-G9Ql) 2018/10/01(月)23:21 ID:2m3Ms8fl0(2/3) AAS
しかしながら右辺値参照を使うとコードを書く人がオブジェクトの所有権を意識せざるを得ない
これを抽象化といわれるとかなり違和感
※ 個人の感想です
895(1): (ワッチョイ bf9f-e6iu) 2018/10/01(月)23:31 ID:rJND5eoS0(2/2) AAS
結局ネストしたオブジェクトってのはどう扱おうと楽な扱いなんてできんってことなんだわ。
同期と効率と安全性を全て容易にするってのは不可能なんじゃないかね。
896: (ワッチョイ 9fbd-G9Ql) 2018/10/01(月)23:41 ID:2m3Ms8fl0(3/3) AAS
>>895
>結局ネストしたオブジェクトってのはどう扱おうと楽な扱いなんてできんってことなんだわ。
いや?
オブジェクトの所有権は最初のcallerががっちり掴んでオブジェクトを使うcallee以下は生ポでおk
全てが調和する
897: (ワッチョイ 5780-q1nr) 2018/10/01(月)23:46 ID:zfKNS/F/0(1) AAS
AA省
898: (ワッチョイ 17b3-kFNE) 2018/10/01(月)23:49 ID:aHxMqUX30(1) AAS
>>894
右辺値参照周りを抽象化とか言ってるアホははちみつだけだろ
899: (アウアウウー Sadb-mlbx) 2018/10/02(火)00:39 ID:YrRJAaFSa(1/3) AAS
外部リンク:ideone.com
上のコードで教えて欲しい。
templateでデフォルト引数で関数を指定する場合、わざわざテンプレートパラメーターFuncにdecltype(...)しなきゃいけないのは何故?
900(1): (ワッチョイ 17b3-aemA) 2018/10/02(火)01:21 ID:HQVsIoxF0(1) AAS
外部リンク:ideone.com
testは関数名だから型じゃない
901: はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/10/02(火)02:10 ID:wuORmtyC0(1/4) AAS
>>894
ムーブだのなんだの言ってても、
C++ の言語機能として直接的に有るのは rvalue 参照を区別して受け取れるってだけで、
所有権の管理をキッチリやってくれるわけではない C++ の限界なんだよね。
だけど、なるべくクラス・関数の実装の中に区別を押し込めて隠す道具のひとつにはなるって話。
でも、中途半端にやるなら隠さないで見せた方がマシという論はわかる。
902(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/10/02(火)05:46 ID:wuORmtyC0(2/4) AAS
受取る関数の側を上手く作っておけば
それを使う側では所有権の移動とかそんなに気にしなくない?
rvalue だったら勝手にちょっと効率的になる (こともある) ねってだけで。
使うときに気にしなくて良いように押し込められるならやっぱり抽象化の道具って言えると思うよ。
903(1): (アウアウウー Sadb-mlbx) 2018/10/02(火)06:04 ID:YrRJAaFSa(2/3) AAS
>>900
ありがとう。
template<typename Func = int (int)>
を
template<typename Func>
にするとエラーになるのは何故?
904: はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/10/02(火)06:50 ID:wuORmtyC0(3/4) AAS
>>903
デフォルト引数からはテンプレート引数を推定できない制限がある。
905: (アウアウウー Sadb-mlbx) 2018/10/02(火)07:00 ID:YrRJAaFSa(3/3) AAS
なるほどです。
906: (ワッチョイ 9702-aemA) 2018/10/02(火)07:46 ID:kk/2dA0Y0(1/6) AAS
時々、イラつかされる制限だ
907: (ラクッペ MM0b-2bq/) 2018/10/02(火)08:15 ID:Tcj3k2lbM(1/4) AAS
>>890
C++が得意なことを教えてください
908: (ブーイモ MM7b-uZyL) 2018/10/02(火)10:26 ID:giBEQZ0BM(1) AAS
>>902
いや呼び出す側に意識させるのが右辺値参照の目的だろ
意識しなくていいようなケースならconst参照で十分
909: (ワッチョイ 9702-aemA) 2018/10/02(火)10:31 ID:kk/2dA0Y0(2/6) AAS
冗談は顔だけにしろよ
たとえばstd::threadの右辺値参照なんぞ意識してるか?
910: (ワッチョイ 17b3-kFNE) 2018/10/02(火)13:13 ID:8CvSI5wK0(1) AAS
一行目に何の意味があるのかわからん
911(1): (JP 0H4f-ZVm4) 2018/10/02(火)15:51 ID:Xh7D/bbnH(1) AAS
割と昔からあるプログラムを見てるんですけど一つのメソッド内で
for(int i = 0; ……){……}
for(i = 0;……){……}
って書き方してるのをちらほら見ます
要は宣言してるんだから使い回せるだろみたいな理屈なんでしょうがビルドしようとすると当然未定義だとエラーが出ます
昔のC++だとこれがオッケーだったりしたんでしょうか?
912(1): (ワッチョイ 9702-aemA) 2018/10/02(火)15:56 ID:kk/2dA0Y0(3/6) AAS
そうだよ
913: (ラクッペ MM0b-2bq/) 2018/10/02(火)16:33 ID:Tcj3k2lbM(2/4) AAS
c++で初心者が作れるものを教えてください
914(1): (ワッチョイ 9702-aemA) 2018/10/02(火)16:37 ID:kk/2dA0Y0(4/6) AAS
rogueとか作って見てはどうよ
SetConsoleCursorPositionとGetKeyStateがあれば何とかなるだろ
915(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/10/02(火)16:39 ID:wuORmtyC0(4/4) AAS
>>911
むしろ古い仕様だと後者の i を宣言しようとすると、
ひとつのスコープ内で同じ名前の変数を定義しようとした扱いになってエラーになったりした。
916(1): (ワッチョイ 9702-aemA) 2018/10/02(火)17:18 ID:kk/2dA0Y0(5/6) AAS
今のコンパイラでも当時の仕様に合わせるオプションはある
917: (ラクッペ MM0b-2bq/) 2018/10/02(火)18:04 ID:Tcj3k2lbM(3/4) AAS
>>914
ありがとう
918: (ラクッペ MM0b-2bq/) 2018/10/02(火)19:05 ID:Tcj3k2lbM(4/4) AAS
C++.でバッチ処理やbashのsedの様な機能はありますか?
919(1): (ワッチョイ 9702-aemA) 2018/10/02(火)19:11 ID:kk/2dA0Y0(6/6) AAS
システムコマンドを実行したいのならsystem関数
正規表現ならstd::regexクラス
ファイル名に関する様々なことはstd::filesystem::pathクラス
920: (ワッチョイ 574e-2bq/) 2018/10/02(火)20:37 ID:YnEH1wx10(1) AAS
>>919
ありがとうございます
とても便利です
921(1): (オッペケ Sr4b-N9wp) 2018/10/03(水)01:07 ID:S2BN/gu+r(1/3) AAS
std::array を自作関数の引数に渡したいときって、サイズはハードコードしないとダメなの?
922(2): さまよえる蟻人間◆T6xkBnTXz7B0 (ワッチョイ d7b3-uTcE) 2018/10/03(水)01:11 ID:gXNqr2Qf0(1) AAS
>>921
template <size_t t_n>
void my_func(std::array<data_t, t_n>& a)
{
...
}
923: (オッペケ Sr4b-N9wp) 2018/10/03(水)01:18 ID:S2BN/gu+r(2/3) AAS
>>922
なるほ
ありがとうございます
924: (オッペケ Sr4b-N9wp) 2018/10/03(水)01:18 ID:S2BN/gu+r(3/3) AAS
>>922
なるほ
ありがとうございます
925(3): (ワッチョイ 1708-ClIk) 2018/10/03(水)03:04 ID:plRFOjxw0(1) AAS
>>912 >>915
ありがとうございました。やっぱそうだったんですね
しかし検索しても全然出てこないというかどう検索したら良いものか。C++98とかの時代になるんですかねぇ
926(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/10/03(水)05:02 ID:jiQInXAP0(1/3) AAS
>>925
たぶんそれより更に前の話だったと思う。
「c++ for文 宣言 スコープ」でググったらこういうのとかヒットした。
外部リンク[html]:www.ksky.ne.jp
D&E でも言及があって、 if 文でのルールと合わせる形で修正したという話が載ってる。
927: (ワッチョイ 373d-0kAr) 2018/10/03(水)05:31 ID:F+YgKz680(1) AAS
>>916
VC++ですら廃止予定だけど
外部リンク[aspx]:msdn.microsoft.com
928: はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/10/03(水)05:33 ID:jiQInXAP0(2/3) AAS
ARM (The Annotated C++ Reference Manual; 外部リンク:amzn.asia ) を確認してみたら、
「初期設定文が宣言ならば、宣言された変数のスコープは for 文を囲むブロックの終わりまでである」
というような記述がある。 (要するに古い仕様)
このあたりから C++98 になるまでの間に修正したってことなんじゃないかと。
929(1): (ワッチョイ 9702-aemA) 2018/10/03(水)07:01 ID:IEc6BJqm0(1/2) AAS
>>926
キーワードと完全に同じ綴りのマクロがあると
標準ヘッダが動作保証外になる
ISO/IEC9899:2011 7.1.2 Standard headers の段落4
930: (スッップ Sdbf-wTw4) 2018/10/03(水)11:00 ID:e50Rb7+yd(1/2) AAS
>>925
最初期の処理系、AT&T cfront の頃からの仕様だから 1980年台だと思う
ちなみに有名な Annotated C++ Reference Manual (ARM) は
この cfront のリファレンスマニュアルに注を付けたもの。
Mac II が出た頃の Mac のソフト開発者は Apple の MPW という開発環境の上で
AT&T のリファレンスマニュアル見ながら cfront で開発していた。
931: (スッップ Sdbf-wTw4) 2018/10/03(水)11:03 ID:e50Rb7+yd(2/2) AAS
>>925
>しかし検索しても全然出てこないというかどう検索したら良いものか。
当時まだ処理系と独立して言語仕様を策定/記述したものは存在していなくて、
上記の cfront のリファレンスマニュアルと cfront の実際の動作が c++ の仕様でした。
932(1): (ワッチョイ 17b3-kFNE) 2018/10/03(水)12:23 ID:eWsEWXO50(1) AAS
>>929
そんなもん古い環境で使うなら標準ヘッダのインクルード後に定義するに決まってるだろ
現行の標準に合わせたいけど仕方なく古い環境でも動くようにしたい場合のテクニックなんだから
933: (ワッチョイ 9702-aemA) 2018/10/03(水)13:10 ID:IEc6BJqm0(2/2) AAS
>>932
俺だったらこう書くぜ
{ for(int i = 0; i < 1; i++) ; }
{ for(int i = 0; i < 1; i++) ; }
前提にしている環境を誤解させかねない変態コードには反対だ
934(1): (ワッチョイ 9f23-wTw4) 2018/10/03(水)13:21 ID:2zzoZNSm0(1) AAS
ヘタレな俺は c 同様直近のブロックの頭で宣言してました
935: はちみつ餃子◆8X2XSCHEME (ワッチョイ bf6f-aemA) 2018/10/03(水)17:25 ID:jiQInXAP0(3/3) AAS
>>934
今では C でもブロックの頭という縛りは無いやで。
936(1): (オッペケ Sr4b-N9wp) 2018/10/03(水)22:30 ID:T5RLH7Axr(1/2) AAS
std::array ってコンパイル時にサイズが決まっていることを想定して作られてるんだよね?
だったら、「可変長ではないがサイズは実行時に決まる」というメモリが連続な配列がほしいなら生配列を使え、というのが C++ を作った人の気持ちなの?
937(1): (アウアウウー Sadb-mlbx) 2018/10/03(水)23:04 ID:p3pJJViFa(1) AAS
それこそvectorじゃないの
938(1): (ワッチョイ 1704-ClIk) 2018/10/03(水)23:19 ID:frDsf1q90(1/2) AAS
>>936
いや、昔はイニシャライザーリストがなかったので、初期化式が使えるオブジェクトの立ち位置だった。
イニシャライザーリストが入ったのでほぼ産廃。constexprの対応もなく死んでいる。
基本的に配列っぽいものがほしかったらベクター使ってっていう趣旨だったと思う。
939(3): (オッペケ Sr4b-N9wp) 2018/10/03(水)23:26 ID:T5RLH7Axr(2/2) AAS
>>937-938
vector ってメモリ空間連続ですか?
だったら迷わずこれ使うんですが
940(1): (ワッチョイ 1704-ClIk) 2018/10/03(水)23:29 ID:frDsf1q90(2/2) AAS
>>939
&V[0]すると一本のメモリの先頭が取れると規格書に書いてあると聞いた。
これは、サイズを拡張するなどのメモリ変更があるまで同じものを指してると思う。
941(1): (ワッチョイ c48a-Aquf) 2018/10/04(木)00:07 ID:zm1AtLvQ0(1) AAS
>>939
迷わず使っていいですよ
942(2): (ワッチョイ 9bc3-dNAh) 2018/10/04(木)00:35 ID:b1qTAw9u0(1) AAS
C++11からvectorのメモリ空間は連続でなければならないと規格で決められた
安心していいよ
943: (オッペケ Sr10-/FYQ) 2018/10/04(木)00:40 ID:bav+IDITr(1) AAS
>>940-942
ありがとうございます
しかしメモリが連続じゃないといけない外部ライブラリに vector 渡すの結構緊張しますね
少し飛躍するのですが、vector の入れ子は流石に連続とは限りませんよね?
944(1): (アウアウウー Sa30-z023) 2018/10/04(木)00:58 ID:s35zoLCpa(1) AAS
メモリ連続させたいならvectorの入れ子はよして。
最初arrayで考えてたなら画像とか行列とかそんな感じかな?
945: (スップ Sdc4-+rwh) 2018/10/04(木)01:32 ID:ezH2Wklod(1/3) AAS
>>942
太古から実際には連続だし規格として明記されたのは C++03 から。
C++11 で連続と規格化されたのは string (basic_string) の方。
946: (オッペケ Sr10-/FYQ) 2018/10/04(木)01:57 ID:CYtCz8O/r(1) AAS
>>944
いえ、もともとは生の一次元配列を使ってて、array の方が取り回しが良いのかなと考えただけです
実際は vector が最強ということですね
入れ子云々は本当に気になっただけです
多次元配列は、色々諦めて Boost を使っています
947(2): (ワッチョイ de8a-F3g9) 2018/10/04(木)03:00 ID:SxiNReMs0(1) AAS
変数名とかクラス名にめちゃくちゃ毎回悩む
従業員の名前、社員番号、階級みたいなクラスを作るときのクラス名とかって普段どうしてる?
Employeeだけで良いのだろうか
DataとかInfoとか意味のあるようでないような命名が頭をよぎってしまう
仮に従業員をEmployeeとしたときに会社名と従業員リストのDictionary<string, List<Employee>>の変数名とかどうすりゃええねんってなる
CompanyではないしCompanyDataだとそれっぽいが的確でもなさそうだし...
948: (スップ Sdc4-+rwh) 2018/10/04(木)03:38 ID:ezH2Wklod(2/3) AAS
emproyees でいいだろ
for (consy auto& emproyee : emproyees["Microsoft"]) ...
949: (スップ Sdc4-+rwh) 2018/10/04(木)03:39 ID:ezH2Wklod(3/3) AAS
rじゃなくてlか
950: さまよえる蟻人間◆T6xkBnTXz7B0 (スププ Sd94-hQIv) 2018/10/04(木)04:00 ID:MLculXgyd(1) AAS
MapCompanyNameToEmployees
951: はちみつ餃子◆8X2XSCHEME (ワッチョイ e66f-vBoO) 2018/10/04(木)04:12 ID:1wg41Y300(1) AAS
>>939
vector が連続と明記されたのは C++03 だが、
C++ 標準の体制としては仕様の「欠陥」と認められた項目については過去の版にさかのぼって適用されることがあり、
vector が連続であるというのもそのひとつのはず。
つまり、 C++98 を名乗る処理系でも vector は連続であるべきで、実際にほとんどそうなっていると思う。
952: (ワッチョイ 1e81-toeJ) 2018/10/04(木)04:54 ID:MQvrn7bB0(1) AAS
>>947
クラス名・変数名に迷ったら書き込むスレ。Part28 [無断転載禁止]©2ch.net
2chスレ:tech
953: (ワッチョイ a6b3-XM+q) 2018/10/04(木)19:12 ID:Ohr0xwue0(1) AAS
>>947
素直に日本語使えばええやんけ。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.434s*