[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/24 15:41 / Filesize : 321 KB / Number-of Response : 1024
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part137



1 名前:デフォルトの名無しさん [2018/08/27(月) 16:02:00.94 ID:vY3QDx2y0.net]
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137
https://mevius.5ch.net/test/read.cgi/tech/1531558382/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/

■長いソースを貼るときはここへ。■
 codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

855 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:51:41.19 ID:GD2dD6IB0.net]
std::auto_ptr<T>はもともとオブジェクトをムーブしたくて生まれたわけでは無いと思う…
確実な解放の実現が先
ムーブする仕様はあと

あとstd::auto_ptr<T>(unique_ptr<T>でも良いが)でも使わないとやってられないシチュがC++には少なくとも1つある

856 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:56:52.23 ID:oWn9MzvpM.net]
move元のオブジェクトに対するアクセスがコンパイルエラーになるんならわかるけど、そうじゃないんなら
大層な仕組みを入れなくても単に unique_ptr を言語組み込みで実装すれば済む話だったのでは?

857 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 19:32:03.30 ID:YVfD+mv1M.net]
お前ら江添に負けて恥ずかしくないの?

858 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 20:26:30.14 ID:1/46iTAZM.net]
全然?

859 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 21:00:53.02 ID:vc6gAAuZd.net]
>>838
それ何が嬉しいんだ?
vector とかどうすんだよ

860 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 22:03:09.07 ID:oWn9MzvpM.net]
>>841
moveするのが分かってるんなら最初からvectorごとヒープに作って unique_ptr で持てばいいでしょ
中途半端にガワだけスタックに置く意味がない

861 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 23:45:25.50 ID:OLOWa9QF0.net]
move後の元オブジェクトを破壊っていうか破棄しようって提案もあったよ。ちょっと早くなるのだとさ。

862 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 00:04:13.06 ID:kBo12DYt0.net]
>>842
ポインターならそもそも copy のコスト安いから move 要らないじゃん

863 名前:デフォルトの名無しさん [2018/09/30(日) 00:20:38.65 ID:aYXyCrkn0.net]
それだったら最初から普通にポインタでかけよ



864 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 00:57:02.37 ID:GfZkWSkk0.net]
この3冊が、神の書!

Linux プログラミング・インタフェース、Michael Kerrisk、2012

C++11/14 コア言語、江添 亮、2015

組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006

865 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 01:40:28.47 ID:CKZYWlYLa.net]
>>844
だからmoveいらないって話でしょ
C++のムーブセマンティクスがああなったのは中途半端にスタックを使うスタイルが定着してしまっていて今更ポインタ使えというのは無理があるからで、
本来は所有権の管理さえ適切に行えるようになってさえいればムーブなんか要らんよ

866 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 06:43:45.01 ID:C9oWPEnUr.net]
C++ Coding Standards って新品で買えないけど代わりになる書籍ありますか?

867 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 06:48:23.20 ID:d4gXl3Bi0.net]
>>847
ポインタ使え思想はすでにC#とかなクラスが参照型な言語で実現されているが
オブジェクトの解放にガベージコレクタが要る言語になった

これはガベージコレクタ無し・所有権の無条件移動だけだと、次のようなケースで早速話が破綻するから仕方が無い
void bar(int n) {
 std::unique_ptr<Foo> a(new Foo());
 for (int i = 0; i < n; i++) {
  func1(a, i);  // func1(a, 0);で所有権がgone 以降のfunc(a, i)はaの不正アクセス
 }
}

不正アクセスにならないように、実際にはこのようなfunc1()にはa.get()でポインタを渡す書き方をする
するとfunc1()以下の呼び出しは全部>>845になる

人類に逃げ場は無い


868 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 06:53:57.08 ID:d4gXl3Bi0.net]
それにポインタ使え思想だと次のようなケースでBaz::m_c[i]のBar:m_b[j]の:Foo::m_aのアクセスに藻前らどんだけ間接参照するんですかと、
class Foo {
 SomeClass m_a;
};
class Bar {
 Foo m_b[100];
};
class Baz {
 Bar m_c[100];
};

869 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 07:13:40.02 ID:d4gXl3Bi0.net]
ちな>>850はm_bやm_cが配列であるため、配列アクセス時の添え字が定数なシチュでもない限り、JITでも間接参照回数を3以下にはできん

870 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 09:10:22.74 ID:3yGUdTqFM.net]
>>849
よくわからんな
848の問題はそれmoveでも一緒だよね
単にデフォルトの挙動がmoveかborrowかだけの話で、unique_ptrがたまたま前者なだけ
スマポ使えば間接参照はどうしても増えるけど、実際>>850のようなケースで特定の要素だけ所有権捨てたりしないでしょ
所有権を移動するかどうかはほぼ例外なくオブジェクト生成時点で予め分かってるんだから、その場合に限ってスマポを使えばよい
コーナーケースのために全てを複雑にする必要はない

871 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 09:21:04.80 ID:d4gXl3Bi0.net]
>>852
>所有権を移動するかどうかはほぼ例外なくオブジェクト生成時点で予め分かってるんだから、
有り得ない仮定すぐる…
>>849なケースにおいて、オブジェクトaの生成時点というのは、
ライブラリー制作者がfunc1()を設計してビルドまで完了した後やがな…

872 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 09:39:54.40 ID:3yGUdTqFM.net]
>>853
自分でも分かってて揚げ足取ろうとしてるんだろうけど、コーディング時に、プログラマがオブジェクトを生成することを意図したコードを記述した時点で、な

873 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 09:46:24.24 ID:d4gXl3Bi0.net]
>>854
いやスマン言い方がまずかったそういう意味ではない
確かに
>所有権を移動するかどうかはほぼ例外なくオブジェクト生成時点で予め分かってるんだから、
というのは真だが、ライブラリのインターフェースに解放が必要なオブジェクトのmoveなど認めたら有り得ないコストが生じるという話

func1()の制作者が所有権を寄越すことを強制した(そういうインターフェース仕様にしてしまった)場合、
func1()を使う人はfunc1()に所有権を渡さねばならない。この結果、
 1. 呼び出し元(func1()を使う人)がaをコピーしてコピーをfunc1()に渡さねばならない
 2. func1()は呼び出しの度に、aを解放する
というのが>>849のコードでn回無駄に繰り返される

これを避ける方法はあるっていやーあるが、結局func1()以下の呼び出しは全部>>845になる(か、ガベージコレクタの出番となる

人類に逃げ場は無い



874 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 09:52:25.65 ID:CKZYWlYLa.net]
>>855
だからそれmoveでも同じことだよね?
ユニバーサル参照のことを言ってるんだとしたら、あれただの型推論だぞ

875 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 10:03:48.10 ID:d4gXl3Bi0.net]
>>856
解放が不要なオブジェクトのmoveは話がちげう
この場合、単に生ポインタ(オブジェクトのアドレス)をfunc1()に渡すのと変わらん
これはライブラリのインターフェースに現れてもコスト的には問題は無い

元レスのアンカー先>>847>>855のコストが避けられない主張

876 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 10:07:31.97 ID:d4gXl3Bi0.net]
いやすまん解放が不要なオブジェクトでも、所有権を移動した場合は>>855の1のコストは避けられないorz
ここは訂正

877 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 10:11:13.08 ID:CKZYWlYLa.net]
>>857
スマポのmoveも本体のmoveも一段間接参照が入る以外は何も変わらないって言ってるんだけど、そんなに難しい話かなあ

878 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 10:45:39.58 ID:d4gXl3Bi0.net]
>>859
>>849>>850は、現行C++におけるスマポのmoveと本体のmoveの優劣は問題にしていない

848を現行C++のコード風に書いたから誤解を招いたのかもしれないが、比較はあくまで現行C++と846思想の比較であって、
846の次の思想を実行に移したら>>855のコストが避けられませんよという話
 1. スタックを使うスタイルはやめるべき(全部スマポであるべき)
 2. 所有権の管理さえ適切に行えるようになってさえいれば(現行C++のムーブセマンティクスみたいな)ムーブなんか要らん

1は現行C++との比較において、間接参照回数に響く
2は現行C++との比較において、現行C++では避けられるコスト(>>855またはガベージコレクション)を無駄に背負い込むことになる

879 名前:はちみつ餃子 mailto:sage [2018/09/30(日) 10:52:02.74 ID:56zUhffF0.net]
>>859
本体のムーブも、ムーブ出来るように書いたらカスタムなスマートポインタみたいになるから、
間接参照が入っちゃうので、なおさら同じではあると思う。

でもまあ、ムーブは抽象化の方法であって、
最終的に実行されることが同じだからなくても良いってのは暴論よね。

880 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 11:10:34.99 ID:f0zM7Hcdr.net]
アンダースコアとドットをこの順で必ず含む string があったとして、アンダースコアからドットまでの部分文字列を切り出す処理って一行で書ける?

substr と find_first_of と find_last_of を組み合わせる方法を考えたんだが、
アンダースコアの前を削る;
ドットの後を削る;
という2行に渡るやり方しか思い付かない

881 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 11:15:56.30 ID:d4gXl3Bi0.net]
ちな
>スマポのmoveも本体のmoveも一段間接参照が入る以外は何も変わらないって
これは現行C++においても違う違いがワカル男ならワカル

func1()からfunc2()にfunc1()の自動変数aをmoveするとして、かつfunc2()はインライン展開されるとすると、
func2()におけるaのメンバへのアクセスはfunc1()呼び出し時点でのスタックポインタ相対で一発でやれる
一方、aがスマポだったりすると、aのメンバへのアクセスの前に、func1()呼び出しの都度1回はスタックポインタ相対でaのアドレスを得なければならない

882 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 11:27:40.54 ID:fM5IaZg4M.net]
オブジェクト本体のメモリのコピーにかかるコストを考慮すればどっちもどっち

883 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 11:54:22.15 ID:u5/6mv7u0.net]
>>862
substr じゃなくて、コンストラクタ使えばいいんじゃね
string t(s.begin() + s.find_first_of('_') + 1, s.begin() + s.find_last_of('.'));



884 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 12:29:37.73 ID:f0zM7Hcdr.net]
>>865
なるほど、ためになります

885 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 12:35:17.89 ID:f0zM7Hcdr.net]
>>865
ふと気になったのですが、このコンストラクタの挙動って他の名前の関数で実装されてないんでしょうか?

886 名前:さまよえる蟻人間 mailto:sage [2018/09/30(日) 12:48:58.63 ID:Eso9UeUod.net]
>>867
assign

887 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 13:18:31.87 ID:f0zM7Hcdr.net]
>>868
何から何までありがとうございます

888 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 14:15:51.90 ID:QSRvujde0.net]
「rustにもあるし俺らも入れなきゃ」くらいの感覚で
今までのシステムとの統合性の難しさなんかほぼ考えないで入れちゃった機能だから。
c++らしいといえばらしい感覚だけど。

889 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 14:22:42.56 ID:d4gXl3Bi0.net]
std::basic_string::find()もイテレータを返すように他のコレクションとの統合性を尊重して欲しいよな

890 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 22:56:12.57 ID:SdlFi6Ao0.net]
findを実行した対象とは別のstringの同じ位置に何かしたいとき
イテレータで返されるとちょっとだけ面倒
まあ大した問題でもないんだけど

891 名前:デフォルトの名無しさん [2018/10/01(月) 17:20:37.02 ID:mKeAnbBU0.net]
moveセマンテックが必要になった理由を理解してないのが多くて驚くばかりだな
破壊して良い中間オブジェクトとそうじゃないのとを区別するために必要なのだよ
ポインタ使えばmove必要ないとかそういう問題じゃない

892 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 17:40:58.61 ID:qsdLJDx40.net]
元はといえば禿が左辺値参照でもconstつければ右辺値を指せるという曲がった話を始めたのが
評判悪くてC++11でやっとやっとやっとやっとメスが入ったのが本当の理由

893 名前:はちみつ餃子 mailto:sage [2018/10/01(月) 18:05:01.87 ID:hbafP85H0.net]
>>873
色んな話題が出てるので混乱してるが、ムーブ不要論を出してる側の *元々の* 主張は >>847 の通り
「ちゃんとした所有権の管理 (たぶん Rust みたいなやつのこと?) が有りさえすれば」
であって、でもそれは C++ ではもはや無理でしょということもわかった上だと思う。



894 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:05:54.55 ID:Gge6W+rt0.net]
Cにも欲しいわ
Cは参照ないから右辺値指示ポインタで

895 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:09:04.02 ID:qsdLJDx40.net]
それを言うなら、右辺値の概念を撤廃すべきでしょ

どんな値もポインタで指すことができ、
ポインタで指すことでregister指定を解除されるという変更

896 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:12:32.93 ID:UY4lJdAP0.net]
テンポラリーオブジェクトなくすと、一回必ず厳密に生成してから仕様になるので、手間増えると思う。

897 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:40:21.84 ID:Gge6W+rt0.net]
右辺値がないと int i = 0; すら書けなくなるんだが

898 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:50:50.76 ID:qsdLJDx40.net]
なんで?

int j;
j ^= j;
int i = j;
左辺値でも問題ないじゃん

899 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:54:00.22 ID:xwh6ZD/vM.net]
>>880
苦しいねーw

900 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:00:24.21 ID:Yquio+NL0.net]
0 以外はどうすんの。

901 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:02:25.38 ID:Gge6W+rt0.net]
> j ^= j;
はい未初期化値を使ったから未定義動作で鼻から悪魔

902 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:04:34.50 ID:Yquio+NL0.net]
char buf[1];

int i = (int)(buf[10] - buf[0]);

で、i = 10 に初期化される。

903 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:05:56.72 ID:xwh6ZD/vM.net]
NaNのときはxorは未定義か、そこまで考えなかったな



904 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:06:32.55 ID:uXaVofwo0.net]
>>884
間違った。正しくは:

char buf[1];

int i = (int)(&buf[10] - &buf[0]); // i = 10 と等価。

905 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:11:01.98 ID:rJND5eoS0.net]
そもそも=の無理やりなオーバーロードや引数に対する暗黙的なattainが問題なんだろう。
しかし元々のcのシンタックスを引き継ぎつつ、上記の問題を解決するのは不可能。

906 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:14:47.64 ID:Gge6W+rt0.net]
>>886
10
0
&buf[10]
&buf[0]
&buf[10] - &buf[0]
(int)(&buf[10] - &buf[0])

右辺値だらけ
やりなおし

907 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:19:47.07 ID:qsdLJDx40.net]
>>882
別に?

int *j;
j = &10;
int i = *j;
てだけじゃん

10が左辺値だったらって話ね

char *j;
j = "\n";
int i = *j;
て話と何か違うの?

908 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:23:45.27 ID:Gge6W+rt0.net]
10が左辺値ならこれ認めるの?
10 = 42;

909 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 21:57:05.81 ID:92NEoPQV0.net]
お前らがC++で作ったことあるものリスト化して

910 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 22:37:33.40 ID:qsdLJDx40.net]
>>890
全然かまわん
int a = 10;
int b = 10;
a = 42;
こう言っているに過ぎない

911 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 22:42:30.92 ID:qsdLJDx40.net]
>>879
そろそろ答えてもらおうか
なぜ右辺値がないと int i = 0; が書けないのか

912 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 23:15:35.29 ID:2m3Ms8fl0.net]
>>875
ていうか所有権などという中途半端な概念にオブジェクトの解放を担わせるのは危険か無意味かのどっちかにしかならない
最後までオブジェクトを使いたい人と、そのオブジェクトを所有する人を
コードに所有権を明示するスタイルで一致させられるケースは少ない

希ガス

913 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 23:21:45.86 ID:2m3Ms8fl0.net]
しかしながら右辺値参照を使うとコードを書く人がオブジェクトの所有権を意識せざるを得ない
これを抽象化といわれるとかなり違和感

※ 個人の感想です



914 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 23:31:19.12 ID:rJND5eoS0.net]
結局ネストしたオブジェクトってのはどう扱おうと楽な扱いなんてできんってことなんだわ。
同期と効率と安全性を全て容易にするってのは不可能なんじゃないかね。

915 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 23:41:31.83 ID:2m3Ms8fl0.net]
>>896
>結局ネストしたオブジェクトってのはどう扱おうと楽な扱いなんてできんってことなんだわ。
いや?
オブジェクトの所有権は最初のcallerががっちり掴んでオブジェクトを使うcallee以下は生ポでおk

全てが調和する

916 名前:デフォルトの名無しさん [2018/10/01(月) 23:46:11.02 ID:zfKNS/F/0.net]
アホどもはやっと気付いたか。。。

コタエ:最初から普通にポインタで書きなさい
   unique_ptr、shared_ptr、weak_ptrなんか使ってるヤツラは
   クルクルパーしかいない


917 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 23:49:34.85 ID:aHxMqUX30.net]
>>895
右辺値参照周りを抽象化とか言ってるアホははちみつだけだろ

918 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 00:39:52.22 ID:YrRJAaFSa.net]
https://ideone.com/BBhHn8

上のコードで教えて欲しい。

templateでデフォルト引数で関数を指定する場合、わざわざテンプレートパラメーターFuncにdecltype(...)しなきゃいけないのは何故?

919 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 01:21:04.00 ID:HQVsIoxF0.net]
https://ideone.com/JKTYpf

testは関数名だから型じゃない

920 名前:はちみつ餃子 mailto:sage [2018/10/02(火) 02:10:18.78 ID:wuORmtyC0.net]
>>895
ムーブだのなんだの言ってても、
C++ の言語機能として直接的に有るのは rvalue 参照を区別して受け取れるってだけで、
所有権の管理をキッチリやってくれるわけではない C++ の限界なんだよね。

だけど、なるべくクラス・関数の実装の中に区別を押し込めて隠す道具のひとつにはなるって話。
でも、中途半端にやるなら隠さないで見せた方がマシという論はわかる。

921 名前:はちみつ餃子 mailto:sage [2018/10/02(火) 05:46:40.59 ID:wuORmtyC0.net]
受取る関数の側を上手く作っておけば
それを使う側では所有権の移動とかそんなに気にしなくない?
rvalue だったら勝手にちょっと効率的になる (こともある) ねってだけで。

使うときに気にしなくて良いように押し込められるならやっぱり抽象化の道具って言えると思うよ。

922 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 06:04:33.19 ID:YrRJAaFSa.net]
>>901
ありがとう。

template<typename Func = int (int)>

template<typename Func>

にするとエラーになるのは何故?

923 名前:はちみつ餃子 mailto:sage [2018/10/02(火) 06:50:19.11 ID:wuORmtyC0.net]
>>904
デフォルト引数からはテンプレート引数を推定できない制限がある。



924 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 07:00:39.49 ID:YrRJAaFSa.net]
なるほどです。

925 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 07:46:51.87 ID:kk/2dA0Y0.net]
時々、イラつかされる制限だ

926 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 08:15:45.67 ID:Tcj3k2lbM.net]
>>891
C++が得意なことを教えてください

927 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 10:26:10.74 ID:giBEQZ0BM.net]
>>903
いや呼び出す側に意識させるのが右辺値参照の目的だろ
意識しなくていいようなケースならconst参照で十分

928 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 10:31:03.15 ID:kk/2dA0Y0.net]
冗談は顔だけにしろよ
たとえばstd::threadの右辺値参照なんぞ意識してるか?

929 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 13:13:32.45 ID:8CvSI5wK0.net]
一行目に何の意味があるのかわからん

930 名前:デフォルトの名無しさん [2018/10/02(火) 15:51:55.37 ID:Xh7D/bbnH.net]
割と昔からあるプログラムを見てるんですけど一つのメソッド内で
for(int i = 0; ……){……}
for(i = 0;……){……}

って書き方してるのをちらほら見ます
要は宣言してるんだから使い回せるだろみたいな理屈なんでしょうがビルドしようとすると当然未定義だとエラーが出ます
昔のC++だとこれがオッケーだったりしたんでしょうか?

931 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 15:56:06.09 ID:kk/2dA0Y0.net]
そうだよ

932 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 16:33:18.83 ID:Tcj3k2lbM.net]
c++で初心者が作れるものを教えてください

933 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 16:37:39.73 ID:kk/2dA0Y0.net]
rogueとか作って見てはどうよ
SetConsoleCursorPositionとGetKeyStateがあれば何とかなるだろ



934 名前:はちみつ餃子 mailto:sage [2018/10/02(火) 16:39:28.61 ID:wuORmtyC0.net]
>>912
むしろ古い仕様だと後者の i を宣言しようとすると、
ひとつのスコープ内で同じ名前の変数を定義しようとした扱いになってエラーになったりした。

935 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 17:18:00.03 ID:kk/2dA0Y0.net]
今のコンパイラでも当時の仕様に合わせるオプションはある

936 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 18:04:17.03 ID:Tcj3k2lbM.net]
>>915
ありがとう

937 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 19:05:29.79 ID:Tcj3k2lbM.net]
C++.でバッチ処理やbashのsedの様な機能はありますか?

938 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 19:11:57.50 ID:kk/2dA0Y0.net]
システムコマンドを実行したいのならsystem関数
正規表現ならstd::regexクラス
ファイル名に関する様々なことはstd::filesystem::pathクラス

939 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 20:37:48.16 ID:YnEH1wx10.net]
>>920
ありがとうございます
とても便利です

940 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 01:07:54.12 ID:S2BN/gu+r.net]
std::array を自作関数の引数に渡したいときって、サイズはハードコードしないとダメなの?

941 名前:さまよえる蟻人間 mailto:sage [2018/10/03(水) 01:11:26.75 ID:gXNqr2Qf0.net]
>>922
template <size_t t_n>
void my_func(std::array<data_t, t_n>& a)
{
...
}

942 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 01:18:33.15 ID:S2BN/gu+r.net]
>>923
なるほ
ありがとうございます

943 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 01:18:50.70 ID:S2BN/gu+r.net]
>>923
なるほ
ありがとうございます



944 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 03:04:58.67 ID:plRFOjxw0.net]
>>913 >>916
ありがとうございました。やっぱそうだったんですね
しかし検索しても全然出てこないというかどう検索したら良いものか。C++98とかの時代になるんですかねぇ

945 名前:はちみつ餃子 mailto:sage [2018/10/03(水) 05:02:16.81 ID:jiQInXAP0.net]
>>926
たぶんそれより更に前の話だったと思う。

「c++ for文 宣言 スコープ」でググったらこういうのとかヒットした。
www.ksky.ne.jp/~seahorse/cpp/loopvar.html

D&E でも言及があって、 if 文でのルールと合わせる形で修正したという話が載ってる。

946 名前:デフォルトの名無しさん mailto:sage [2018/10/03( ]
[ここ壊れてます]

947 名前:水) 05:31:10.20 ID:F+YgKz680.net mailto: >>917
VC++ですら廃止予定だけど
https://msdn.microsoft.com/ja-jp/library/84wcsx8x.aspx
[]
[ここ壊れてます]

948 名前:はちみつ餃子 mailto:sage [2018/10/03(水) 05:33:04.20 ID:jiQInXAP0.net]
ARM (The Annotated C++ Reference Manual; amzn.asia/d/53K2HrA ) を確認してみたら、
「初期設定文が宣言ならば、宣言された変数のスコープは for 文を囲むブロックの終わりまでである」
というような記述がある。 (要するに古い仕様)

このあたりから C++98 になるまでの間に修正したってことなんじゃないかと。

949 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 07:01:52.10 ID:IEc6BJqm0.net]
>>927

キーワードと完全に同じ綴りのマクロがあると
標準ヘッダが動作保証外になる

ISO/IEC9899:2011 7.1.2 Standard headers の段落4

950 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 11:00:28.82 ID:e50Rb7+yd.net]
>>926
最初期の処理系、AT&T cfront の頃からの仕様だから 1980年台だと思う
ちなみに有名な Annotated C++ Reference Manual (ARM) は
この cfront のリファレンスマニュアルに注を付けたもの。

Mac II が出た頃の Mac のソフト開発者は Apple の MPW という開発環境の上で
AT&T のリファレンスマニュアル見ながら cfront で開発していた。

951 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 11:03:08.53 ID:e50Rb7+yd.net]
>>926
>しかし検索しても全然出てこないというかどう検索したら良いものか。

当時まだ処理系と独立して言語仕様を策定/記述したものは存在していなくて、
上記の

952 名前: cfront のリファレンスマニュアルと cfront の実際の動作が c++ の仕様でした。 []
[ここ壊れてます]

953 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 12:23:08.82 ID:eWsEWXO50.net]
>>930
そんなもん古い環境で使うなら標準ヘッダのインクルード後に定義するに決まってるだろ
現行の標準に合わせたいけど仕方なく古い環境でも動くようにしたい場合のテクニックなんだから



954 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:10:09.63 ID:IEc6BJqm0.net]
>>933
俺だったらこう書くぜ
{ for(int i = 0; i < 1; i++) ; }
{ for(int i = 0; i < 1; i++) ; }
前提にしている環境を誤解させかねない変態コードには反対だ

955 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:21:21.77 ID:2zzoZNSm0.net]
ヘタレな俺は c 同様直近のブロックの頭で宣言してました






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<321KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef