20/03/24 00:04:33 YFRNwZnv.net
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part149
スレリンク(tech板)
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
スレリンク(tech板)
■長いソースを貼るときはここへ。■
URLリンク(codepad.org)
URLリンク(ideone.com)
[C++ FAQ]
URLリンク(isocpp.org)
URLリンク(www.bohyoh.com) (日本語)
テンプレここまで
2:デフォルトの名無しさん
20/03/24 02:17:13.57 9OEj9KSc.net
「ちんちんプラプラソーセージ」という言い伝えがあるがの、
それは、「C + + 双生児」、つまり、C++と双璧をなす言語の出現を予言したものだったのだよ。
3:デフォルトの名無しさん
20/03/24 13:19:52.34 j37mJqK4.net
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
---- テンプレ ここまで ----
4:デフォルトの名無しさん
20/03/24 14:30:36 dZNjE6fy.net
すげーSTLで外出しされると思ってる馬鹿がいるぞ
5:◆QZaw55cn4c
20/03/24 23:27:02 KtfI6cNR.net
スレリンク(tech板:937番)
URLリンク(ideone.com)
江添さんが間違って「末尾再帰である」と断定した記述方法 f() を、
正しく末尾再帰で記述すると g() になります。
これを最適化して h() とするのには、関数 g() を特別に解析することなく機械的に変換するだけでいいのです
最適化に機械的に変換するだけでいい、というのが末尾再帰の本質です
したがって >>934 の制限は妥当でしょうね
6:デフォルトの名無しさん
20/03/25 07:20:29 2w2fR+tZ.net
941 自分:デフォルトの名無しさん[sage] 投稿日:2020/03/21(土) 19:59:14.68 ID:uResqVEz [3/3]
「末尾再帰」という情報処理用語を定義しているJIS規格票もしくは
"tail recursion" という情報処理用語を定義しているISO規格票の
条項を出せるやついるの?
これだけ上から目線でマウント取っといて
あげくオレ用語だったら恥ずかしいぞ
7:はちみつ餃子
20/03/25 17:42:48.23 lGt7vmdl.net
JIS X 0007 に「再帰」に関連するいくつかの用語があるけど、
その周辺に「末尾再帰」は書かれていないので情報処理用語の規格として
定義されたものはたぶんないんだろうと思う。
用語として定義されてはいないけど、
DSSSL の規格 (JISX4153) に「実装は、正しく末尾再帰を扱えなければならない」という文言として
現れているのは見つけた。
DSSSL がベースにしているのが R4RS (← Scheme の規格の第4版の通称) であることも書いてあるから
ここでいう末尾再帰は R4RS が言う末尾再帰だと考えていいと思う。
だけど R4RS だとどういう場合が末尾再帰なのかようわからんのよなぁ。
(形式的意味論で書いてあるところを読み解ける人にはわかるのかもしれない。)
R5RS 以降だとだいぶん分かりやすく書いてあるんだけど。
8:デフォルトの名無しさん
20/03/25 18:35:34.29 iLx6+8HG.net
8コアマシンでninja -j4 -l4すると固まるんだけどninja何してんの
9:デフォルトの名無しさん
20/03/25 19:58:22.06 qvXjJ9lz.net
汚いことに決まってんだろ
10:デフォルトの名無しさん
20/03/25 21:43:33 JWtS3Wj0.net
アイエエエエエ
11:デフォルトの名無しさん
20/03/25 21:45:30 uGR4bFBq.net
ninjaずるい
12:デフォルトの名無しさん
20/03/25 21:50:47 lUBLXJbP.net
ninjaだいすき
13:デフォルトの名無しさん
20/03/26 00:08:16.23 fd5gxTEt.net
忍者だが、電車に乗っていたら下痢したのでそおっと席を立ち駅に向かったらしい
14:デフォルトの名無しさん
20/03/26 03:05:23.06 7mWqVwqc.net
汚いなさすが忍者きたない
15:デフォルトの名無しさん
20/03/27 12:47:40 yDbWAejo.net
禿げや江添さん
16:見て分かる通り。 禿げてる。
17:デフォルトの名無しさん
20/03/27 21:04:21.22 MA/4mtFY.net
禿が作った言語は長生きするんだっけ?
18:デフォルトの名無しさん
20/03/27 22:52:04.36 eQxgR1y2.net
ウルセー ハゲハダマッテロ
∧___∧ / / / /
⊂( ・∀・) 、,Jし // パン
(几と ノ ) て.彡⌒ ミ
//'|ヽソ 彡 Y⌒Y( ´;ω;`)
/ノ / | \ 彡 l r Y i|
ヽ/、/ヽ/ ヽ/ U>>3|:_|j
19:デフォルトの名無しさん
20/03/28 02:01:55 8uQkqVES.net
髭だろ
ハゲが作った言語なんてc++しか思い浮かばない
20:デフォルトの名無しさん
20/03/28 09:50:32 laMmnOq7.net
ハゲが作った移動通信会社なんて知らない
21:デフォルトの名無しさん
20/03/28 16:10:38 jYzb+dLM.net
Visual Studio C++ 2019 にて、パフォーマンスプロファイラーを使うと、
__CheckForDebuggerJustMyCode
という関数が呼び出されていて結構な負荷になっています。
デバッグ時にこれをOFFにしたいのですが、どうやって消せばよろしいのでしょうか?
22:はちみつ餃子 ◆8X2XSCHEME
20/03/28 16:39:28 FOAUxWzd.net
>>20
私は Visual Studio を導入していないので試してないけど公式な情報があるやが。
URLリンク(docs.microsoft.com)
23:デフォルトの名無しさん
20/03/28 17:20:15.83 jYzb+dLM.net
>>21
見逃してたけろ(´・ω・`)
ありがとう
24:◆QZaw55cn4c
20/03/28 20:30:35 WJROMx30.net
江添氏 C++ 入門にまた誤りを見つけました
URLリンク(ezoeryou.github.io)
> int main() {
> double NaN = std::numeric_limits<double>::quiet_NaN() ;
> // true
> bool b = NaN != 0.0 ;
> // false
> bool a = NaN == 0.0 ;
> bool c = NaN == NaN ;
> bool d = NaN != NaN ;
> bool e = NaN < 0.0 ;
>}
こちらで試してみると、bool c = NaN != NaN の値は true でした。
URLリンク(ideone.com)
>整数であれば、'a == b'がfalseであるならば、'a != b'なのだと仮定してもよいが、こと浮動小数点数の場合、NaNの存在があるために必ずしもそうとは限らない。
残念ながら、a, b, のいずれかまたは両方が Nan であっても、a == b が false ならば a != b true であることを確かめました
江添さん、だいじょうぶですかね?
25:◆QZaw55cn4c
20/03/28 20:33:39 WJROMx30.net
失礼
×bool c = NaN != NaN の値は true でした。
○bool d = NaN != NaN の値は true でした。
訂正箇所は他にはなく、「a == b が false ならば a != b true であることは、double a, b が NaN であってもいえる」
26:デフォルトの名無しさん
20/03/28 23:03:59.81 TAn8n6A3.net
3/14は円周率の日
とくに2015年はアメリカ式日付表記で3/14/15なので100年に1回だったという、
■ Googleの円周率31兆4000億桁までの計算について、きちんと解説
URLリンク(www.blog)
27:.umentu.work/google-circle-3-14/ ■ 多倍長計算の技法(3章) http://www.kurims.kyoto-u.ac.jp/~ooura/pi04.pdf
28:デフォルトの名無しさん
20/03/28 23:04:23.60 TAn8n6A3.net
誤爆すたorz
29:デフォルトの名無しさん
20/03/29 00:16:32.66 t2YV962W.net
江添のことはほっといてやれよ。。
30:デフォルトの名無しさん
20/03/29 01:26:13 sawiSEmu.net
>>23-24 少しでも被害者を減らすために issue 立てといてもらえませんかね?
31:デフォルトの名無しさん
20/03/29 01:55:28.30 tSgWoZoj.net
村上原野が死亡。
Sprout はど~なっちゃうの~
32:デフォルトの名無しさん
20/03/29 01:57:11.38 KAJzXRPk.net
デザインパターンのブリッジパターンやストラテジパターンのようなケースで
インターフェースクラスを継承して実装クラスを作る場合、
class If() /* interface */
{
public:
If() {}
virtual ~If*( {}
virtual void func() {}
};
class Impl() : public If
{
public:
Impl() {}
~Impl() {}
void func() {}
};
のようにすると思いますが、Implクラスをさらに基底クラス(ImplBase)と2種類の派生クラス(ImplA, ImplB)に分けたい場合、
多重継承以外でやるには、どうするのが良いでしょうか?
まず If を ImplBase に継承させて、次に ImplBase を ImplA と ImplB に継承させる事になるでしょうか?
その場合、純粋仮想関数func()はどのように書くべきでしょうか? ImplBase も virtual void func()としておいて
ImplA で実装するのでしょうか?
33:デフォルトの名無しさん
20/03/29 02:19:11.85 p3fh4h77.net
constexprの中二女子亡くなってたのか・・・
34:デフォルトの名無しさん
20/03/29 02:26:21.63 p3fh4h77.net
>>30
ImplBaseにどんな役割を持たせたいかによるんじゃない?
ImplAとImplBがそれぞれIfを継承するのでは何が不満なのかをハッキリしないと何を解決すればいいのかわからない
35:デフォルトの名無しさん
20/03/29 08:26:45 zFUy7lJg.net
>>29
え、持病でもあったの?
36:デフォルトの名無しさん
20/03/29 09:05:51.82 GFdzppn9.net
中二で死ぬって早すぎないか
37:デフォルトの名無しさん
20/03/29 10:02:27 +/sFre8I.net
>>23
NaNが「不定」を意味するなら、理論的には
> // false
> bool c = NaN == NaN ;
> bool d = NaN != NaN ;
が正しいんだろう
仕様は上のようになってて、実装依存ということはないか?
38:デフォルトの名無しさん
20/03/29 10:26:02 zyhHBMyS.net
NaNとの!=以外の比較演算は常にfalse、!=は常にtrue
ってするのが普通みたいだけど
39:デフォルトの名無しさん
20/03/29 10:36:40 oQB7eLYm.net
そもそも非数に「等しい」なんて場合があるのか?
数学的におかしくね?
40:デフォルトの名無しさん
20/03/29 10:49:11 +/sFre8I.net
本来は「非数」なら「等しくない」も議論できない気がするのでなんとも
0/0->NaNなら「不定」と解釈してもおかしくないし、その場合、
NaN!=NaNは「ほとんどの場合に正しい」としか言えない
41:デフォルトの名無しさん
20/03/29 11:12:19 CNNBvMSR.net
!=は==の否定だから、NaN == NaNはfalseなので
NaN != NaN -> !(NaN == NaN) はtrue
ほかの等値比較の意味論に合わせてるんだと
42:デフォルトの名無しさん
20/03/29 11:22:58 sawiSEmu.net
>>35
std::numeric_limits<T>::is_iec559 (IEEE 754) の場合は NaN!=NaN に定まる模様。
URLリンク(stackoverflow.com)
> I read the IEEE-754 rules on NaN, which states:
>> The comparisons EQ, GT, GE, LT, and LE, when either or both operands is NaN returns FALSE.
>> The comparison NE, when either or both operands is NaN returns TRUE.
C++の規定はこう。
URLリンク(www.open-std.org) [expr.eq]
(C++14でも同じ URLリンク(timsong-cpp.github.io) )
> If two operands compare equal, the result is true for the == operator
> and false for the != operator. If two operands compare unequal,
> the result is false for the == operator and true for the != operator.
> Otherwise, the result of each of the operators is unspecified.
これだけなら「equalでもunequalでもない」として結果を不定とする実装もあり得る。
ただしCの規定には以下のものがある。
URLリンク(www.open-std.org) Equality operators
> The == (equal to) and != (not equal to) operators are ...
> For any pair of operands, exactly one of the relations is true.
これによれば NaN==NaN, NaN!=NaN を両方 false とするCの実装は許されない。
わざわざこれに反するようなC++の実装が作られる理由は無さそうだし、受け入れられることも無さそう。
43:デフォルトの名無しさん
20/03/29 13:05:33.90 0VKwdtls.net
ieee754の書き方が難しすぎて何処をどう読めばNaN!=NaNになるのか分からん…
44:デフォルトの名無しさん
20/03/29 13:28:15.35 oQB7eLYm.net
現実は>>39なんだろうけど
原理主義的にはNaNの比較は例外を投げるべき
45:デフォルトの名無しさん
20/03/29 13:57:09.44 vg0TAzW0.net
NaNを無限と言い換えて数学的な議論をするしかない
46:デフォルトの名無しさん
20/03/29 15:32:11 nDbo81n4.net
みんな大好き超準解析、
47:デフォルトの名無しさん
20/03/29 15:32:36 CNNBvMSR.net
実際こんなのもある
URLリンク(cpprefjp.github.io)
48:デフォルトの名無しさん
20/03/29 16:10:11.53 p3fh4h77.net
江添が悪い
たぶんx==xが常に真になるとは限らない(xがNaNの場合)って話を間違えて覚えてたんだろ
49:
20/03/29 16:13:08.71 GnieE+99.net
>>28
私は江添氏の本を買って読んでおり、個人的に非常に参考になる、どちらかといえば良書の部類だと考えておりますので
「被害者を減らす」という発想はありえないのです
50:はちみつ餃子
20/03/29 16:39:47.96 tSgWoZoj.net
>>47
総合的な判断がどうあれそこが間違ってるなら間違ってるだろ。
51:デフォルトの名無しさん
20/03/29 17:54:48 oQB7eLYm.net
江添氏はブログを立てて不特定多数の一般人からの指摘を待っている
誤りの指摘はそこでやれ、それが「被害者を減らす」ことにつながる
江添が見ている保証のないこんなところで正義面しても
そういう筋が何もわかっちゃいないやつというだけだ
52:
20/03/29 18:15:14.00 GnieE+99.net
>>49
私個人では誤りを指摘するのには非力でしょう、したがってここで相談してから正式な申し入れをする手順を踏みたいと思います、それが読者のため、江添氏のためでもあります
査読を継続します
53:はちみつ餃子 ◆8X2XSCHEME
20/03/29 18:27:59 tSgWoZoj.net
本当に間違っているという確信がなくて事前に相談するってのならまあそれもいいんじゃないの。
54:デフォルトの名無しさん
20/03/29 18:41:01 xWXht+2h.net
江添さんに聞くのが一番速い。
55:デフォルトの名無しさん
20/03/29 22:23:18 6MT5MhMu.net
ここ見てそうだしな
56:デフォルトの名無しさん
20/03/30 00:19:48 DkauJosI.net
あの人もうスノボに夢中でC++に興味なさそう
57:デフォルトの名無しさん
20/03/30 01:01:09 PZnOEjGK.net
C++なんかやってるのにスノボもやってるのか異端だな
58:デフォルトの名無しさん
20/03/30 09:52:17 6jBFblvz.net
githubのissue放置してるじゃん
59:デフォルトの名無しさん
20/03/30 13:41:16.50 hh56tBZl.net
ベクトルが二つあって重複部分を差分取得になるように結合したいです
in
1,2,3,4
3,4,5,6
out
1,2,3,4,5,6
重複がなければそのまま結合でいいです
60:デフォルトの名無しさん
20/03/30 19:24:54.69 ubfGsS+F.net
std::sort
std::unique
std::set_union
61:デフォルトの名無しさん
20/03/30 19:28:43 Oymj8mf6.net
>>57
その程度なら、ネットで検索して見つからないようなら、手で書いたほうが早いね。
2つの列を共にソートしたあと、マージソートの様に左端から順に比較して同じなら
1つ分だけ dest にコピーするようにすれば良いだけ。
62:デフォルトの名無しさん
20/03/30 19:44:49 UMPMfaDu.net
標準委員から無視されていじけてるんだろう。ショーもねー奴だよ。
63:デフォルトの名無しさん
20/03/31 00:16:01 FylkZaNQ.net
new, deleteとか手動でやるのはもう古すぎて使わない?スマートポインタ使うのが普通?
64:デフォルトの名無しさん
20/03/31 01:00:25.49 oKg2nb+1.net
必要な時は使えばいいと思うけど自分は全く使わなくなった
65:デフォルトの名無しさん
20/03/31 01:34:17.99 s0jfH2wf.net
初めてクラスを使ったのですが、forループの中で関数のように使う場合には
1. 毎回デフォルトコンストラクタに引数を食わせて初期化してからgetterで計算する
2. 初期化はループの外でして置いてループ内ではsetterなどで引数を読み込ませてからgetterで計算する
どちらの方が良いんですかね?
あと、あるメンバ変数に連動したメンバ変数みたいなものって作れますか?
int _a
int _b = _a / 2みたいなものです
66:デフォルトの名無しさん
20/03/31 01:43:07.29 oKg2nb+1.net
後半の方はint getHalfA()みたいなメンバ関数を設ければいい
前半は関数オブジェクトのこと?何言ってんのかわからん
67:デフォルトの名無しさん
20/03/31 03:22:08 Yt3qMdaP.net
>>63
1,2は、速度面以外ではどちらでもいいが、速度を重視するなら2。
なお、getter, setter は元々、巨大なプログラムでバグを減らすために発明されたようなものだから、小さいプログラムでは特に使う必要は無い。
68:デフォルトの名無しさん
20/03/31 03:28:43 Yt3qMdaP.net
>>65
C#では、getter, setter を凄く高頻度で使ってもいいような設計思想なのかもしれないが、かなり意見が分かれるところ。
クラスを保護する目的では使っても良いが、普通の代入とは動作を変えてしまいすぎる
ようなものは想定した動作との勘違いによる逆にバグの元になる可能性があるのでお勧めしない。
使い道があるのは、代入箇所や読み取り箇所の動作の変更を手作業や grep 置換に頼らずに確実に行いたいような場合だと思うが、小規模なプログラムでは単純に手作業や grep 置換で直した方がよい。
新しい機能は大宣伝されるので初心者が飛び付きがちだが、実は余り普段は使わないほうが良い機能であることもかなり多いので注意。
69:デフォルトの名無しさん
20/03/31 08:10:50 Zjo4xAEk.net
>>63
教条主義なら1番
毎ループの中でオブジェクトはそれぞれ異なる
今回の関数Aと前回の関数Aは別物である、という思想になる
逐一newするとそれっぽくなる
70:デフォルトの名無しさん
20/03/31 10:02:16 OTxurRkT.net
>>63
そういう問題を自分が求めるパフォーマンスレベルに最適化できる(やらなきゃならん)のがc++だぞ。
71:はちみつ餃子 ◆8X2XSCHEME
20/03/31 10:16:06 Ow5tuxOJ.net
>>63
デフォルトコンストラクタは引数をとらないコンストラクタのことなのでなんか勘違いしてるぞ。
実行コストか抽象化の都合でどうしても事前にしなければならないことがあるなら 2 の選択肢しかないし、
そうでないときはクラスにする意味がないので普通の関数で書けばよくねって思う。
そのふたつの選択肢の間で迷わなければならない場面というのが既になんかおかしい状態に入り込んでる気がする。
72:デフォルトの名無しさん
20/03/31 10:34:43.57 6MgwCPiX.net
c++使いなら速度を追求しろ
速度こそ正義だ
73:デフォルトの名無しさん
20/03/31 12:31:40 b6kPBFRe.net
>>66
C#は実行時最適化に期待できるのと、ABI互換するのが作法なんで
C++で真似する意味はあんまりないよね。
74:デフォルトの名無しさん
20/03/31 12:39:27 tVRDD1dz.net
おい、パフュームはコーディング捗るぞ。
75:デフォルトの名無しさん
20/03/31 14:18:42 PMv8PBMm.net
なんか前提条件抜きで「こう書くのが良い」みたいな答えを求める初心者が最近多いっぽいな
セオリーに従順といえば聞こえはいいが、自分のおかれてる状況でどうすべきかの決断をとことんサボろうとしてるとも言える
76:デフォルトの名無しさん
20/03/31 14:28:08.91 daGoeiYK.net
>>71
「C#はABI互換するのが作法」
という意味が分からないので詳しく。
個人的には、C#でgetter,setterが作り易くなっているのは、HTMLの「property」
を操作するJSの流儀にルーツを持つのではないかと思っている。
そう思う理由の一つは、WinFormsでも、イベントハンドラ(関数)を登録するのに、インスタンス変数に関数の名前を代入するような形式を使っているのが、JSのイベントハンドらの作法にそっくりだし、
Formのフラグ類の設定方法が、HTMLのpropertyやCSSのstyleの設定方法とそっくりだから。
普通、C++だとメンバ関数を通じてオブジェクトに「命令を出す」事でオブジェクトの状態を変える
作法が取られることが多いが、JSだと同じ事をpropertyを設定することで行う。
後者の場合、propertyを設定したら、イベント終了後にDOM要素が自動的にその変化が反映される。
JSのその作法はコードを短く書くのには適してはいるが、インタプリタ的な動作でも有り、
変数の代入のように見える書き方に「副作用」が伴うのがC/C++言語の文化だとちょっと違和感を感じる
人も居ると思う。
77:デフォルトの名無しさん
20/03/31 14:39:26.00 daGoeiYK.net
>>74
なお個人的には、
C#のような自動化された setter, getter を使うより、
void SetXxx(TYPE x); や TYPE GetXxx();
を明示的に使ったほうが、set, get している場所をgrep検索し易いと思う。
xxx = yyy で settter を呼び出す作法の場合、grep検索するなら、
正規表現で xxx*s\= などと書く必要があるし、コンストラクタで
使われている場合や関数の引数に「代入」されている場合にはこれでは検索しきれない。
自動化されることで使用箇所が見えにくくなり、トラブルの元になる可能性がある。
getterの方は使用箇所の検索は不可能になる。
78:デフォルトの名無しさん
20/03/31 14:42:36.42 DEnjdkJH.net
C#はC++と違ってシンボルの完璧な静的解決が可能だからgrep性なんかどうでもいいんだよ
VSでポチポチしたら一瞬で完全な呼び出しツリーが出来上
79:がる
80:デフォルトの名無しさん
20/03/31 15:09:58.10 OTxurRkT.net
>>73
プログラマは怠惰であるべきってのを間違ったとらえ方してるバカは世の中には多い。
81:デフォルトの名無しさん
20/03/31 15:12:48.63 YcGHsuX6.net
>>75
メモ帳でコード書いてるのか?w
82:デフォルトの名無しさん
20/03/31 17:49:17.43 tVRDD1dz.net
viでは。
83:デフォルトの名無しさん
20/03/31 20:44:47 HDRrREDo.net
【速報】東京都が #新型コロナウイルス 感染症死亡者数を過少評価か、
「例年より少ない」とされていたインフルエンザ関連死が急増=国立感染症研究所
URLリンク(www.niid.go.jp) …
コロナで死んだのインフルに振り替えてるんじゃまいか
こういうニュースが出てくる時点で隠蔽はもう無理
おそらくパンデミックは避けられないと思うね
84:デフォルトの名無しさん
20/03/31 22:00:06 ox5sQqez.net
言語仕様はメモ帳で書く場合を想定すべき
メモ帳で楽に書ければ開発環境でも楽に書けるが、逆はない
開発環境がなければ書けないような構文は構文自体おかしいと認識するべきだ
85:デフォルトの名無しさん
20/03/31 22:01:35 L/5UA51D.net
なぜメモ帳?
そこはedlinだろ?
86:デフォルトの名無しさん
20/03/31 22:05:49 tVRDD1dz.net
Excelよく使ってる。
87:デフォルトの名無しさん
20/03/31 22:07:47 tVRDD1dz.net
ExcelはExtended cellという意味とExcellentという意味がある。
と思う。
88:デフォルトの名無しさん
20/03/31 22:14:04.53 tVRDD1dz.net
電卓にはプログラマ・モードがあるのに。
Excelにはない。
不思議な話だ。
89:デフォルトの名無しさん
20/03/31 22:14:37.75 tVRDD1dz.net
そういえば電卓も良く使う。
90:デフォルトの名無しさん
20/03/31 22:19:10.66 L/5UA51D.net
そりゃmac用ソフトだもの
91:デフォルトの名無しさん
20/03/31 22:52:39.00 s0jfH2wf.net
皆さんありがとうございます
正直個人で利用するだけなら関数でいいし今までも関数で済ましてたんですが、他人に教えるときに変数定義などが散らばってると教えるのが面倒くさいという理由でクラス化したんですよね
92:デフォルトの名無しさん
20/03/31 23:13:13.12 W8+rJJar.net
関数で済むならその方が良い
プログラムが複雑な動作ができるのは「状態(=変数)」を持つから
単純にできるならその方が良い
変数は悪だよ、必要悪
93:デフォルトの名無しさん
20/04/01 08:43:31 BVkSt5Rw.net
class変数ってのはstatic変数とlocal変数の中間的なイメージをもってる。
static変数よりかマシだけど状態を持つことには変わりはない。
まあlocal変数だけでプログラムするのもつらいって場面も多いけど。
94:デフォルトの名無しさん
20/04/01 13:47:46.62 PC8mhvaW.net
気になったので教えて
c++的に関数のbool型戻り値に関数の成功失敗返すとして、真が成功で偽が失敗が一般的?
c言語だと戻り値がintで0が成功、それ以外が失敗ってのか良くあるけど、c++もこの形が一般的?(偽が成功、真が失敗)
個人的には前者を良く使うんだけど
95:デフォルトの名無しさん
20/04/01 13:55:09.05 BVkSt5Rw.net
boolとintで区別するってのが一般的で
boolの場合言ってる通りでintの場合cの流儀に沿うのが普通じゃね。
96:はちみつ餃子 ◆8X2XSCHEME
20/04/01 14:38:59 S74lm4t5.net
>>91
エラーであることと同時にエラーの内容 (エラーコード) も返したいという要求がある。
なので 0 を成功として、失敗ならエラー内容に対応する数値 (真値) を返すというやり方が生まれた。
でも C の標準ライブラリには失敗として 0 を返した上でエラーの内容は errno に設定するものもあるし、
グダグダなんやわ。
真偽のどちらを成功とするか失敗とするかは、どちらかが一般的と言えるほど統一されてはいない�
97:ニ思う。 C++ だと失敗は例外で投げてしまえるから返却値はあくまでも正常系のみの結果を返すべきという意見もあるし、 例外は何かと問題があるので避けた方がいいという人もいる。 std::optional は「有効な値があるとき」と「有効な値がないとき」を区別できるけど、 成功・失敗に対応づけるにはちょっとイマイチな感じもあるしなぁ……。 結局のところ場合による。
98:デフォルトの名無しさん
20/04/01 17:14:10.11 15FH3/nz.net
おれも >>92 の認識
結果boolとintでfalse/0の意味が入れ替わるわけだが
intはエラーコードを返す余地があるが
boolの場合失敗をfalseでだけで返しても実用上役に立たないと思う
falseが返ってきたら呼び出し側は何をすればいいかまで考えるべき
内部エラー的などうしようもないもののときは関数内で勝手にabortした方がまし
99:デフォルトの名無しさん
20/04/01 18:14:31 MoTGnEfh.net
>>94
実は、エラー番号を返されても、出来ることは限られていて、
ハードウェアエラーの様なものなら、使用者にそのメッセージを
表示することは出来るが、単に関数の呼び出し方の間違いの場合も
多くてその場合は開発時にエラー番号を調べて対処するしかない。
エラー番号によってプログラムの動作を変えて対処できるケースは全体のごく一部。
100:デフォルトの名無しさん
20/04/01 19:18:06.29 15FH3/nz.net
>>95
それで十分役にたっとるがなw
実行時にあらゆるエラーをリカバリーしろという話ではないさ
101:デフォルトの名無しさん
20/04/01 19:24:00.89 Awd6zvg2.net
std::sortにconstexprが付くことについてコメントお願いします。
102:デフォルトの名無しさん
20/04/01 22:38:47.73 3pIDnj5r.net
標準ライブラリで付けられるところには全部付けろ
103:デフォルトの名無しさん
20/04/01 23:20:02.25 Awd6zvg2.net
コンパイル時にソートしてくれるってやばない?
104:デフォルトの名無しさん
20/04/02 00:18:03.16 Gf7PuiHp.net
左様boolを成功か失敗かの意味で使うのが悪い
boolは単純に真偽として解釈すべきでありかつその解釈で十分な場合に使う他無い
例: std::vector::empty()
どーしても成功か失敗かの意味で使いたいなら
成功なら真、失敗なら偽の値を返す関数なりマクロなりで
wrapした結果をboolにすべきや
例:
inline bool SUCCEEDED(int retval) { retun (retval == 0); }
inline bool FAILED(int retval) { return (retval != 0); }
105:デフォルトの名無しさん
20/04/02 00:21:01.87 Wbq1ni9c.net
constexprはやばいがなぜにソート?
というかコンパイル時ソートの需要なんかあんのか?
100万件のデータをソースに埋め込んでコンパイル時にソートしたいとは思わないな
106:デフォルトの名無しさん
20/04/02 00:25:29.31 44dV9Os2.net
そんなでかいのコンパイルに時間がかかって仕方がない
数十数百までなら実用的なコンパイル時間で済みそうだし需要はあるだろ
107:デフォルトの名無しさん
20/04/02 00:38:17 Wbq1ni9c.net
その程度なら実行時でいいやってなる
108:デフォルトの名無しさん
20/04/02 00:43:04 44dV9Os2.net
ソート後もまだコンパイル時評価に使えるじゃん
109:デフォルトの名無しさん
20/04/02 01:00:56 Wbq1ni9c.net
意味わからんけど
コンパイル時にソートしてくれるのはいいと思うよ
でもそれがスゲー便利とはならないだろうなってこと
110:デフォルトの名無しさん
20/04/02 01:08:47 I8hlhwK7.net
明らかにアンチパターンだろ。
constexprてフーリエ変換の係数とか定数だけどちょっとした計算が必要なものに使うもんだろうに。
111:デフォルトの名無しさん
20/04/02 01:25:43 44dV9Os2.net
いや、それこそruntimeで良いんじゃね
112:はちみつ餃子 ◆8X2XSCHEME
20/04/02 03:49:46 sLIn31jD.net
>>106
プログラマに対してアンチパターンだろっていうのと標準ライブラリがどうあるべきかってのは違うでしょ。
標準ライブラリがやってくれる分にはプログラマにとっては何も損なことはないじゃん。
113:デフォルトの名無しさん
20/04/02 06:22:02.07 I8hlhwK7.net
>>108
不自然なことやってバギーだったり、その挙動がユーザーにとってデバッグしずらいものだったら
プログラマーにとって損だろ。
なんでもコンパイラにやらせればいいと思ってる輩はそのことを全く理解してない。
114:デフォルトの名無しさん
20/04/02 06:40:45.16 H71dGAdS.net
ソートが必要になる程のデータ数をコンパイル時に用意するならコンパイル時ファイル読み込みも必要じゃない
115:デフォルトの名無しさん
20/04/02 08:31:42 SbwrDqdV.net
>>109
> 不自然なことやって
不自然かどうかは単なるお前の主観
> バギーだったり、
処理系の問題
> その挙動がユーザーにとってデバッグしずらいものだったら
無理矢理の仮定
> プログラマーにとって損だろ。
お前にとって損なだけ
コンパイル時できることはコンパイル時にやるのはC/C++の思想としては当たり前
嫌なら使わなきゃいいだけ
116:デフォルトの名無しさん
20/04/02 12:24:51 Wbq1ni9c.net
あんまり同意できないね
仕事で使う上だと嫌なら使うなというのは困る
多人数で作るうえでは使わないなら使われない仕組みが必要だからね
あとユーザが気軽にO(n^2)、O(n^3)みたない激重アルゴリズムをコンパイルフェーズに
組み込めるわけだけど、それコンパイラの仕事か?と思う
大規規模開発だとコンパイル時間の伸びは問題になる
フェーズわけるべきだよね
実際ビルド時に事前計算するものは多々あるけど、個別にスクリプトとか組むことに別に不満ないし
c++のコンパイルで一発で完結する必要性を感じない
117:デフォルトの名無しさん
20/04/02 13:47:09 RbNpa6BP.net
嫌なら使うなって、C/C++のことだろ
つまり転職したほうがいいと暗に言っている
118:デフォルトの名無しさん
20/04/02 13:48:21.30 1Y8qGLwI.net
うん、まぁ、自分ならメタプログラミングとか特殊化で
定数のソートがあったら助かるかも・・助からないかも・・程度だけど
標準のやることに疑問を呈すと必ず>>111みたいな変なのが湧くよね
まぁ、コンパイル時のソートしてもしなくてもコンパイル時のオーバーヘッドは微々たるもんじゃね?
大量のインスタンス化とかが起きなければ。
119:デフォルトの名無しさん
20/04/02 13:54:25.98 1Y8qGLwI.net
あ、あと
>コンパイル時できることはコンパイル時にやるのはC/C++の思想としては当たり前
20年使ってるがそんな思想聞いたこともない
あとコンパイル時に出来る(上に、後で困ったりしない)場面って少ないよ
実際のソフト開発に使ったことないと気付かないんだろうけど
120:デフォルトの名無しさん
20/04/02 14:01:37.69 Tie7sLxb.net
いや、constexprのお陰もあってコンパイル時に解決できることは思いの外増えている
121:デフォルトの名無しさん
20/04/02 14:09:38.15 1Y8qGLwI.net
実例挙げてくれ
122:はちみつ餃子
20/04/02 14:31:13.11 sLIn31jD.net
constexpr つっても定数式の文脈以外ではコンパイルのフェイズで計算する保証はないよ。
コンパイラの裁量でほどほどにしてくれるからコンパイルのコストが極端に増大することは心配しなくていい。
(たぶんオプションとかで制御できるようになってる。)
constexpr の制約の範囲内に変形するのが難しいようなものまで無理して constexpr 化する必要はないけど、
付けれるもんなら付けとくくらいのスタンスでよいんじゃないかなぁ。
123:デフォルトの名無しさん
20/04/02 14:37:59.99 Qj/v/C6S.net
保証も何も、実行時にしか分からん値をどうやってコンパイル時に計算するんだ
はちみつ自身よく分かってないだろ
124:デフォルトの名無しさん
20/04/02 14:38:59.27 Qj/v/C6S.net
>(たぶんオプションとかで制御できるようになってる。)
初耳だな
125:はちみつ餃子 ◆8X2XSCHEME
20/04/02 14:44:22 sLIn31jD.net
gcc のオプションをざっと検索してみたけど、
定数式の文脈とそうでないときを区別して指定するようなものは見つからんかった……。
126:はちみつ餃子 ◆8X2XSCHEME
20/04/02 14:45:31 sLIn31jD.net
>>119
入力がコンパイル時にわかる値 (定数式) でもその関数の呼び出し自身が定数式の文脈にない場合のことを言ってる。
127:デフォルトの名無しさん
20/04/02 15:00:36.45 Qj/v/C6S.net
>>122
「定数式の文脈以外では」保証もクソも原理的に不可能だと言ってんの
128:
129:はちみつ餃子
20/04/02 15:11:28.10 sLIn31jD.net
>>123
できるよ。 入力が定数式なら。
130:デフォルトの名無しさん
20/04/02 15:21:55.32 Qj/v/C6S.net
それを定数式の文脈と呼ぶんじゃないの
131:はちみつ餃子
20/04/02 15:24:28.21 sLIn31jD.net
>>125
いいえ。
132:デフォルトの名無しさん
20/04/02 15:26:39.69 Qj/v/C6S.net
あー調べたら意味わかったわ、結果を格納する左辺が非constexprなら定数式としては呼ばれないと決まってるんだな
それを定数式の文脈と呼ぶのはおかしいと思うが
133:はちみつ餃子
20/04/02 15:30:04.54 sLIn31jD.net
>>127
cpprefjp でそういう用語を使ってるから私もそれに倣ったんだけども、
cppreference の方では「定数式を要求する文脈」という言い方をしてるなぁ。
こっちの方がわかりやすいと思うので今後はこっちを使うようにするよ。
134:デフォルトの名無しさん
20/04/02 16:34:46 WWm7acVs.net
標準化以前からTMP大ウケだったC++に何求めてるんだよ
135:デフォルトの名無しさん
20/04/02 17:00:14 0tSRYO67.net
使い道を想像できない人のほうが多いことにとても驚いてます。
136:デフォルトの名無しさん
20/04/02 17:05:14 0tSRYO67.net
Javaは心が洗われるような美しい言語だったのに、豆とか言い出したあたりから汚れてしまった。
もはや何も感じない。
137:デフォルトの名無しさん
20/04/02 17:05:16 Qj/v/C6S.net
>>130
だから実例よろしく
138:デフォルトの名無しさん
20/04/02 17:05:53 0tSRYO67.net
>>132
Excel使わなくて済むなって。
139:デフォルトの名無しさん
20/04/02 17:08:51 0tSRYO67.net
URLリンク(html.spec.whatwg.org)
今ここやってんの。
色々検索してたら、std::sortにconstexprが付くというのを見つけて。
なんだこれ!
なんだこれ!
なんだこれ!
となった。
でもまだついてないから使えない。
140:デフォルトの名無しさん
20/04/02 17:11:36.01 Wbq1ni9c.net
なぜ驚くのかよくわからん
ポイントは何?
141:デフォルトの名無しさん
20/04/02 17:19:53 RbNpa6BP.net
翻訳時に解決できることを、実行環境に持ち越さないために
コンパイラ方式であることが20年かかってもわからんやつが
constexprという止めまで刺されてまだ暴れてるな
142:デフォルトの名無しさん
20/04/02 17:21:23 I8hlhwK7.net
20年前のitaniumみたいな失敗を繰り返そうとしてるバカ。
143:デフォルトの名無しさん
20/04/02 17:48:06 0tSRYO67.net
大 変 驚 い て い ま す !
144:デフォルトの名無しさん
20/04/02 17:53:56 uLX+Lk1l.net
コンパイル時にソートできるのか
145:デフォルトの名無しさん
20/04/02 18:05:19 Qj/v/C6S.net
>>136
うん、だから実例よろしく
所詮、TMPでやってたことを実行時コンパイル時普通の関数の形で書けるなら便利ってだけの話だよね
constexprの利点がそれ以上であるというなら実例出せ
146:デフォルトの名無しさん
20/04/02 18:12:59 0tSRYO67.net
発想を逆にしてみたらどうだろ。
100万件のデータをソートしたらコンパイル時間が増えるみたいな方向性じゃなくて。
100万件のデータにマッチさせる側の数十件の情報をコンパイル時にソートするとしたら?
ぐもももも!ってなる。
ちなみに100万件の文字列をソートするのは数百ミリ秒。
そんなに怖がるほどでもない。
147:デフォルトの名無しさん
20/04/02 18:13:43 RbNpa6BP.net
>>140
コンパイラ方式という壮大な実例を出しているんだが
20年かかってもわからんやつには無理のようだな
148:デフォルトの名無しさん
20/04/02 18:19:18 Qj/v/C6S.net
>>141
普通そういうのはファイルから読むだろうしなぁ・・
(そういう意味では>>110に同意するけど
149:デフォルトの名無しさん
20/04/02 18:23:36.92 0tSRYO67.net
こ れ は 凄 い こ と で す よ !
150:デフォルトの名無しさん
20/04/02 18:26:27.69 0tSRYO67.net
21世紀最大の発明と言われる右辺値参照についてもコメントお願いします。
ノーベル賞はいつ決まるんでしょうか。
151:デフォルトの名無しさん
20/04/02 18:28:13.54 jVaX7Z/j.net
まあPL/1は35年前からプリプロセッサでサブルーチンも定義できてたから今更コンパイル時にソートできてもたいした驚きはないわ
152:デフォルトの名無しさん
20/04/02 18:35:18 4Juv79OL.net
西洋人の決定論が反映されている
「未来は決まって無い」という考え方はダイナミックであり動的と呼ばれる
「未来は全て決まっている」というのが彼らの古典的な思�
153:l方法 未来において起こることの全ては、あらかじめ既に決まっている というか、神が決めた そういう宗教的思想あるいは神学が反映されている
154:デフォルトの名無しさん
20/04/02 18:42:26 0tSRYO67.net
禿 げ に ノ ー ベ ル 賞 を !
155:デフォルトの名無しさん
20/04/02 18:51:05.61 0tSRYO67.net
>>147
ドラゴンブックを一通り実装したかどうかで変わるだけでは。
156:デフォルトの名無しさん
20/04/02 19:38:08.14 x6ke+Z1w.net
右辺値参照とmoveでET不要になる?
157:デフォルトの名無しさん
20/04/02 21:38:05 sLIn31jD.net
>>150
不要にはならない。
より効果的に使えるようになる。
158:デフォルトの名無しさん
20/04/02 21:57:48 RbNpa6BP.net
>>147
自分が書いたコードの中までコペンハーゲン解釈なんだろ
量子コンピュータでもないTTL~CMOSの回路で
159:デフォルトの名無しさん
20/04/03 19:34:28.81 UoNKEVCn.net
>>150
「ET」とはなんですか?
160:デフォルトの名無しさん
20/04/03 21:35:11 SADwXAP6.net
>>153
ET (Expression Template)
161:デフォルトの名無しさん
20/04/03 22:08:14 FLH8K04k.net
>>152
デジタル回路は決定論的かもしれんがI/Oを通して外界と繋がっている件
162:デフォルトの名無しさん
20/04/05 06:22:54.73 g2vNnymJ.net
デマングルのことで質問があります。Ubuntu上でwebkitgtkというライブラリを見てるんですが、ライブラリ内に
以下のような2つのシンボル
_ZN3WTF6StringC1EPKDsj
_ZN3WTF6StringC2EPKDsj
があるんですが、これらはデマングル後
WTF::String::String(char16_t const*, unsigned int)
WTF::String::String(char16_t const*, unsigned int)
となって区別がつかない(少なくとも自分には)んですが、これはどういうことでしょう。C1とC2という部分の違いは...
ちなみに元のコード上では同じ型のコンストラクタがダブってたりはしていません(と思います)。し、ダブってたら
コンパイル時にエラーになりますよね?
リンカー的にはデマングル前のシンボルで扱うんでしょうから両者とも必要なんでしょうねやはり
163:デフォルトの名無しさん
20/04/05 08:18:36 QAcrCW73.net
unique_ptrについて質問です。
std::unique_ptr<T> uptr(new T);
に対して、uptr.get() と *reinterpret_cast<T**>(&uptr) は常に一致するでしょうか。
用途としては生ポインタの配列を受けとる関数にstd::vector<std::unique_ptr<T>>を渡したいです。
例:
void display_ptr(size_t n, int** pp){
for(size_t i=0; i<n; ++i){
std::cout << pp[i] << '\n';
}
}
int main(){
std::vector<std::unique_ptr<int>> vec;
for(size_t i=0; i<3; ++i){
vec.emplace_back(new int);
}
display_ptr(vec.size(), reinterpret_cast<int**>(&vec[0]));
return 0;
}
164:デフォルトの名無しさん
20/04/05 09:51:55 LNp8foc9.net
>>157
しない
165:デフォルトの名無しさん
20/04/05 13:16:18.53 P07lI1PF.net
>>156
URLリンク(chromium.googlesource.com)
88行あたりから
166:デフォルトの名無しさん
20/04/05 14:16:13 LNp8foc9.net
>>156
ググったらすぐに出てきたぞ
URLリンク(stackoverflow.com)
167:デフォルトの名無しさん
20/04/05 14:41:32 P07lI1PF.net
UChar * と char16_t * の方だから 84-86 行目の方だったスマソ
168:デフォルトの名無しさん
20/04/05 17:57:58 IgCOpQa5.net
>>160
おっとすみません、単なるその説明の訳かもしれませんが、 内部
169:的には (1)基底クラスを直接使う時のコンストラクタ (2)基底クラスから継承したクラスを 使う時に基底クラスを初期化するコンストラクタ と二つある、 けどデマングルした名前では両者の区別はつかなくなる(だけ)、みたいな感じでいいんですかね? >>159 >>161 うーんと意味がよくわからないです。あと、特定のコードには寄らない話っぽいですね。
170:デフォルトの名無しさん
20/04/06 00:17:22 YN01J8oK.net
2次元のレイキャスティングを作成しようとしてます。
URLリンク(github.com)
にあるコードを現在javaで書いており、
URLリンク(youtu.be)
のように縦に長く1本線が出来てほしいのですが、
縦やにブロックを並べた時に、なぜか1ブロックごとに線が出来てしまいます。
どうすれば動画みたいに、縦に長い1本線が出来ますでしょうか?
コードは
URLリンク(ideone.com)
に載せてみました。
171:デフォルトの名無しさん
20/04/06 00:42:09 JpxE2ikJ.net
Javaの質問ならJavaスレへ逝け
172:デフォルトの名無しさん
20/04/06 00:49:35 /hNEVjF2.net
無駄に長い一本糞を作りたいのなら修行を積んでください
173:デフォルトの名無しさん
20/04/06 20:20:19 umYPTPrb.net
わかりました。javaの法で聞きます。
174:デフォルトの名無しさん
20/04/06 20:22:44 g7Z03+iy.net
そこをなんとか!
175:デフォルトの名無しさん
20/04/08 01:04:01 sLx4/ZJO.net
質問ですが抽象メソッドを有するクラスのデストラクタは
なんで勝手に仮想デストラクタにならないんでしょうか…
なんか有用なイディオムでもあるんでしょうか……………
C#しばらくやった後だったのでC#のつもりでインターフェースを定義して
virtual ~IFoo() { }
を書き忘れた結果盛大にリークすたgrz
176:はちみつ餃子
20/04/08 09:41:04.41 kI16h2GK.net
>>168
ゼロオーバーヘッドの原則は C++ 的にはかなり強い要請なので……。
オブジェクトに常にポインタを保持しなければならないことと、
呼び出すときに仮想関数テーブルをたどるコストがあるってのは看過できなかったんだろう。
177:デフォルトの名無しさん
20/04/08 09:52:16.86 BKxeQF3m.net
ん~そもそも抽象と仮想はもともとの発想が違うから似て非なるもの
さらにC#においてclassとinterfaceは似て非なるもの
C++に厳密な意味でinterfaceを実現する機能はない
そのへんはよしなによしなに
ていうか~IFOOの書き忘れがリークの元凶て発想があかん
解放し忘れしたらあかん物はsafe~とかのクラスに押し込むべき
178:デフォルトの名無しさん
20/04/08 10:09:18 bRUXA7Cg.net
でも仮想関数を持つクラスのデストラクタをわざわざ非仮想にするメリットってなんかあるの?実際の所
179:デフォルトの名無しさん
20/04/08 10:20:56.86 iAMh5USc.net
shared_ptrで管理するなら仮想デストラクタである必要がない
無駄に遅くなる
180:デフォルトの名無しさん
20/04/08 11:24:20.39 BKxeQF3m.net
>>171
インターフェースという位置づけなら仮想・非仮想どちらにしろデストラクタが直に呼ばれるべきじゃないんじゃないかと思うわ
ただのインターフェースだからむしろ非仮想&protectedで隠すのがいいんじゃないかと(しらんけど)
↓こんなイメージで直にデストラクタ触れるのはclass A以降
struct IFOO
{
protected:~IFOO();
};
class A:IFOO
{
public: virtual ~A();
};
class B:A{};
class C:A{};
181:デフォルトの名無しさん
20/04/08 11:40:23.05 bRUXA7Cg.net
それって要するに解放する時に、IFOOじゃなくてAだとかBだとかの
インスタンスの正体を全て把握しとけってことでしょ?
だったらそもそもIFOOって必要なの?って思う
182:デフォルトの名無しさん
20/04/08 11:48:39.21 cOYSaP/H.net
>>171
俺の狭い知見ではまず無いと思うよ
ただvirtual付けてないのに勝手に仮想になると言うのもいかがなものかと思う
183:デフォルトの名無しさん
20/04/08 12:03:48.95 cOYSaP/H.net
途中で書き込んでしまった
なので、やるとしても警告を出すぐらいだな
って思ってたらVisual Studio 2017だと既に警告出るわ(「警告をすべて有効にする」にしないとダメだけど)
warning C4265: 'C': クラスは仮想関数を含んでいますが、デストラクタはこのクラスの仮想インスタンスではなく、正しく消滅されない可能性があります
184:デフォルトの名無しさん
20/04/08 12:54:49.68 BKxeQF3m.net
>>174
まあ不要かもしらんけどねぇ
でもC#でも仮想デストラクタを入れてるインターフェースてなくね?
リソース開放を請け負うIDisposableにしても派生クラスのデストラクタから呼び出す形
呼び出さなきゃ勝手に呼ばれるわけでもない
むしろ仮想デストラクタは便利だから使う程度の利点しかなくてインターフェースとしては不要なんじゃないかと言う気がする
185:デフォルトの名無しさん
20/04/08 13:19:13.33 bRUXA7Cg.net
GCがあるC#の話されても困る
186:デフォルトの名無しさん
20/04/08 13:27:08 lWfV0IAd.net
GCに夢観過ぎ
187:デフォルトの名無しさん
20/04/08 13:32:26 bRUXA7Cg.net
夢の話じゃなくてリソース解放戦略が全然違うんだから比べても仕方ないだろ
というかそもそもC#は全部のメソッドがC++で言うところのvirtualなんだから比べようもない
188:デフォルトの名無しさん
20/04/08 14:40:59.29 lr7ClYRx.net
学術の巨大掲示板群 - アルファ・ラボ
URLリンク(x0000.net)<)
189:デフォルトの名無しさん
20/04/08 21:04:52 4NV79iCU.net
GC教のやつC++破門な
190:デフォルトの名無しさん
20/04/08 22:17:53 sLx4/ZJO.net
class IFoo {
virtual int sum(int a, int b) const = 0;
};
これの書き方でリーク原因だったという話、
191:デフォルトの名無しさん
20/04/08 22:20:32 17Fq4h5D.net
コンパイラがクソなだけ
192:デフォルトの名無しさん
20/04/08 22:23:35 sLx4/ZJO.net
public: を忘れたgrz、
で、
class IFoo {
public:
virtual ~IFoo() { }
virtual int sum(int a, int b) const = 0;
};
としたら治まった、
193:デフォルトの名無しさん
20/04/08 22:26:09 sLx4/ZJO.net
>>172
std::shared_ptr<(IFooの派生クラス)> pObj(new (IFooの派生クラス)()) ならそもそもsumの方こそ仮想関数でなくても良い
std::shared_ptr<IFoo> pObj(new (IFooの派生クラス()) ならデストラクタが仮想でないとマズー
仮想関数有りかつ非仮想デストラクタ、を許すC++のこの仕様の理由をゼロオーバーヘッドの原則で説明くのであれば
仮想関数有りかつ非仮想デストラクタ、を許すことで得られる性能上のメリットが指摘されねばならない
194:デフォルトの名無しさん
20/04/08 22:35:26 iAMh5USc.net
てかそれshared_ptrの作り方が悪いだけじゃん
普通make_sharedで作る。
weakを使う場合でオブジェクト自身が巨大なためメモリは即座に解放したいときでも一度newした型のshared_ptr作れと
195:デフォルトの名無しさん
20/04/08 22:36:00 d4D5nRup.net
ほう、でそのメリットとは?
196:デフォルトの名無しさん
20/04/08 22:38:08 iAMh5USc.net
大体純粋仮想しか持たないクラスって要はinterfaceでしょ
そのポインタで派生オブジェクトのインスタンスのリソース管理するってのとは全く別の概念じゃないか
197:デフォルトの名無しさん
20/04/08 22:39:37 sLx4/ZJO.net
>>189
C++に向かって言うと良い
198:デフォルトの名無しさん
20/04/08 22:51:06 iAMh5USc.net
>>186
あー何となくわかったわ
shared_ptrの使い方分かってないのね
一度派生型のshared_ptrで作ったら、それをbaseのshared_ptrに代入して保持していても、デストラクタは元の型で呼ばれるよ
ってかそういう風に使うもの
newと入れるshared_ptrの型を変えるのはダメな使い方
199:デフォルトの名無しさん
20/04/08 22:56:00 iAMh5USc.net
って思ったけどよく考えたらいきなりbaseのshared_ptrに入れても大丈夫だったはず
200:デフォルトの名無しさん
20/04/08 22:57:35 sLx4/ZJO.net
(はてさて…よくわかっていないのはどちらなのやろうか…
201:デフォルトの名無しさん
20/04/08 23:01:19 iAMh5USc.net
>>193
いや、上でも下でも不味くない
きちんと派生クラスのデストラクタが呼ばれるよ
202:デフォルトの名無しさん
20/04/08 23:44:04 oQNNxwBC.net
>一度派生型のshared_ptrで作ったら、それをbaseのshared_ptrに代入して保持していても、デストラクタは元の型で呼ばれるよ
えっそうなん?って試してみたらマジだった。
URLリンク(ideone.com)
URLリンク(cpprefjp.github.io)
> 通常、void*に型変換して代入されたポインタは、delete演算子を呼んだとしても元の型のデストラクタは呼び出されない。しかしshared_ptrの場合は、代入されたポインタの型が持つデストラクタが正しく実行されることが保証される。
知らんかった。
203:デフォルトの名無しさん
20/04/08 23:57:12 bRUXA7Cg.net
万能じゃないけどな
作る時に本来の型を教えないといけない
shared_ptr<Base> s(new Derived()) // OK
Base* b = new Derived();
shared_ptr<Base> s(b); // NG
204:デフォルトの名無しさん
20/04/09 00:30:09.12 U7264wso.net
> 作る時に本来の型を教えないといけない
なるほど。
URLリンク(ideone.com)
教えてくれてありがとうな。勉強になる。
205:デフォルトの名無しさん
20/04/09 00:57:59.70 1Z0E9i00.net
なんのためのvirtualなのか解ってないのか
206:デフォルトの名無しさん
20/04/09 01:01:05.17 fPJh3bcf.net
ば、ばーちゃん…
207:デフォルトの名無しさん
20/04/09 02:46:58.11 xoGUUmQY.net
横レスですみませんがそもそもポインタなんてCの配列かscanfくらいでしか使ったことないんですがスマポとかってどんな事(時)に使うんですか?
208:デフォルトの名無しさん
20/04/09 03:49:37 Jilblwzi.net
スマートポインタどころか、new deleteさえ使わなくなったな。
209:デフォルトの名無しさん
20/04/09 06:58:42.11 G208HopB.net
>>200
動的なメモリ確保をしたことがない?
210:デフォルトの名無しさん
20/04/09 07:41:56 Jilblwzi.net
昔はよくやりましたよね。
211:デフォルトの名無しさん
20/04/09 07:44:32 jjLWwUCO.net
結局、計算資源はそのスコープで管理するってのが主流になりつつある。
212:デフォルトの名無しさん
20/04/09 08:55:49.91 LQ7/CkSE.net
C++は昔からそうだったと思うが
まぁCだと関数が確保して呼び出し元でどうこうするのも多かったけど
213:デフォルトの名無しさん
20/04/09 09:06:44.43 jjLWwUCO.net
例外入れてそういう性質は薄れてるでしょ。
214:デフォルトの名無しさん
20/04/09 16:57:05 J3GRH2ud.net
URLリンク(ideone.com)
意味わからん。
215:デフォルトの名無しさん
20/04/09 17:00:04 J3GRH2ud.net
std::make_shared<hoge>(); 知らんの?
216:デフォルトの名無しさん
20/04/09 17:34:40 l1qMzl9z.net
>>207
mainでsort呼び出すところで、boolの後にret=みたいなのが無いせいで変に解釈されている
217:デフォルトの名無しさん
20/04/09 18:20:12.74 uChXMS9h.net
>>200
CreateWindowExのlParam経由でオブジェクトのポインタを渡して受けて側でunique_ptrに格納して管理したりしてるよ
218:デフォルトの名無しさん
20/04/09 18:20:40.62 RTR2QVCs.net
>>204
スコープを飛び越えて永続的にデータを保持するために使うのが Heap なんだが。
219:デフォルトの名無しさん
20/04/09 19:11:41.90 jjLWwUCO.net
>>211
だからあんまり使わんようにって感じなってるだろ。
使うとしてもスマポであるスコープ外れたら回収するように作るとか、
そういう方向をどの言語も推奨してる。
220:デフォルトの名無しさん
20/04/09 19:18:35.93 l1qMzl9z.net
使わんように成っていないよなぁ
221:デフォルトの名無しさん
20/04/09 19:58:02 J3GRH2ud.net
>>209 thx!
222:デフォルトの名無しさん
20/04/09 21:40:49 c2wEsJAp.net
>>212
> そういう方向をどの言語も推奨してる。
具体的にどの言語のことを言ってるんだ?
223:デフォルトの名無しさん
20/04/09 22:37:55.19 jjLWwUCO.net
python,go,rustあたり見てもスコープ抜けた時に後処理する機構をサポートしとる。
224:デフォルトの名無しさん
20/04/09 22:46:51.57 Yh5weH6+.net
お前はスコープで管理するのが主流っていったわけだけど
gcのないc++ではスコープで管理�
225:ナきるものはスコープで管理するのは 大昔から当たり前ではないでしょうか 何がいいたいのやらわからん
226:デフォルトの名無しさん
20/04/09 23:15:28.15 U1el1zKz.net
C++はおじょーずでも日本語アレな奴多いよね
職場でちゃんとコミュニケーションとれてるか?www
227:デフォルトの名無しさん
20/04/09 23:46:04.93 l1qMzl9z.net
そんなん昔からじゃん
それこそcどころかアセンブラの頃から
228:デフォルトの名無しさん
20/04/10 02:12:51.60 W/LKdoJE.net
コンピュータとコミュニケーション取る方が大事だから
229:デフォルトの名無しさん
20/04/10 05:02:14.17 sn6MPl7m.net
>>216
スコープ抜けた時の後処理ってなんだ?
まさかと思うがGCの話じゃないよな?
230:デフォルトの名無しさん
20/04/10 06:08:55 JXOjZTrq.net
プログラミングスタイルが変わってきてるんだよね。
アジャイルとOOPは相性が悪いのかもしれない。
231:デフォルトの名無しさん
20/04/10 06:35:52 +a3yzOMH.net
sort(
vecVisibilityPolygonPoints.begin(),
vecVisibilityPolygonPoints.end(),
[&](const tuple<float, float, float> &t1, const tuple<float, float, float> &t2)
{
return get<0>(t1) < get<0>(t2);
});
はt1の最初に設定されたfloatとt2の最初に設定されたfloatを比較して昇順に並べているのでしょうか?
[&]の意味はよく分からなくて教えて頂けると幸いです。
232:デフォルトの名無しさん
20/04/10 06:43:17 JXOjZTrq.net
そうですね。
&に何の意味があるのか僕にもわかりません。
233:デフォルトの名無しさん
20/04/10 07:08:42 j4px16+n.net
>>223
>t1の最初に設定されたfloatとt2の最初に設定されたfloatを比較して昇順に並べているのでしょうか?
その通りです。get<0>(t)でタプルの最初の要素を取り出して大小比較してます。
ちなみにget<0>を使わずに直接 t1 < t2 と比較すればタプルの左の要素から順に辞書順でsortされます。リンク先の(3)参照。
URLリンク(ja.cppreference.com)
[&]はラムダ式の中で使われる外部の変数を参照で持ってくるものです。リンク先のラムダキャプチャを参照。
ただ上の例ではそもそも外部の変数を使っていないので[&]ではなく単に[]で問題ないです。
URLリンク(ja.cppreference.com)
234:デフォルトの名無しさん
20/04/10 09:22:51 dM0rZx5j.net
>>217
当たり前はそうなんだが言語機能や標準ライブラリでそういうのを守りやすくしようぜって
流れは感じるけどね。
235:デフォルトの名無しさん
20/04/10 10:43:26 Ntz3fYqx.net
>>226
お前さんがそこで流れと言っているものは別に最近できた流れでもなく、昔からあったし随時拡充されてきているものだぞ。
236:デフォルトの名無しさん
20/04/10 11:08:46 JXOjZTrq.net
じゃあnewしたら負けって事で。
237:デフォルトの名無しさん
20/04/10 11:14:55.67 JXOjZTrq.net
僕も流れを感じますね。
このフォースを感じ取れないものもいるんですね。
少し驚きました。
238:デフォルトの名無しさん
20/04/10 11:17:22.22 nz1tlAhX.net
get<0> とか get<1> とか観るとげんなりする
なんで動的にアクセスできないんだ
239:デフォルトの名無しさん
20/04/10 11:19:41.31 W/LKdoJE.net
そりゃ0番目と1番目の型が違うかもしれないからだよ
240:はちみつ餃子
20/04/10 11:23:39.14 n212JbcP.net
>>230
タプルはそれぞれの要素の型が違う可能性があるから仕方がないし、
array とかなら get を使わない選択肢があるんだから問題なくね?
241:デフォルトの名無しさん
20/04/10 11:27:18.78 JXOjZTrq.net
格納する値の型を知っているのに相称型でしかアクセスできないのは不便ではないかというご提案として、受け付けました。
進捗状況は、ご提案番号1として随時ご確認できます。
格納する値が実行時にしか確定しない以上、コンパイラが値の型にアクセスすることも出来ないんだよな。
std::variantのoperator==は荒業でアクセスしてるよね。
242:デフォルトの名無しさん
20/04/10 11:53:36 OfwBXl+o.net
あらかじめインデックス渡した関数テンプレートを実体化して
boost::any
243:みたいなものを返すという力技でどうにか出来なくもないだろうけど 上の方で何でもコンパイル時にやるのが良い事みたいに思ってるアホがいたけど この辺の問題全く分かってないんだろうなぁ (tupleを否定してるわけじゃないので変な噛み付き方しないように
244:デフォルトの名無しさん
20/04/10 12:15:49 GQp0hxvn.net
学術巨大掲示板群: アルファ・ラボ
URLリンク(x0000.net)
物理学 化学 数学 生物学 天文学 地理地学
IT 電子 工学 国語 方言 言語学 など
245:デフォルトの名無しさん
20/04/10 12:21:34 W/LKdoJE.net
int要素が1個だけならget<int>でアクセスできなかったっけ
246:デフォルトの名無しさん
20/04/10 12:33:52 JXOjZTrq.net
出来る限りコンパイル時に解決したほうが良いと思います。
247:デフォルトの名無しさん
20/04/10 12:37:34 JXOjZTrq.net
constexpr ifで実行時の条件分岐数を減らす。
これがいま話題の都会的プログラミング。
248:デフォルトの名無しさん
20/04/10 12:52:10 VwhukIlH.net
>>230
楽してコストを減らす工夫だよ
見た目がイヤなら横着しないで
ちゃんと意味がわかる名前を付けなさい
249:デフォルトの名無しさん
20/04/10 12:59:34 VwhukIlH.net
template < typename > union vector3 {
struct {
T x;
T y;
T z;
};
T[3];
T&operator[](int n);
const T& operator [](int n) const;
};
250:デフォルトの名無しさん
20/04/10 12:59:47 JXOjZTrq.net
定数に名前つけるのはどうだろか。
251:デフォルトの名無しさん
20/04/10 13:06:38.10 VwhukIlH.net
>>238
規模の小さな小さなプログラムでしか効果が無いようなことが都会的かあ
252:デフォルトの名無しさん
20/04/10 13:26:20.94 JXOjZTrq.net
フォースを感じ取るんだ。
253:デフォルトの名無しさん
20/04/10 13:55:31.86 Ntz3fYqx.net
>>242
何も知らない田舎者が漠然と憧れてイメージする都会ってことだろう
254:デフォルトの名無しさん
20/04/10 14:25:31.83 JXOjZTrq.net
岡山は大都会。
255:デフォルトの名無しさん
20/04/10 15:17:20.24 C0/P2P/U.net
都会が優れていると思っている人を見ると、馬鹿なのかな、と思ってしまう。
256:デフォルトの名無しさん
20/04/10 16:06:17.50 JXOjZTrq.net
キミ良いこと言うね。
257:デフォルトの名無しさん
20/04/10 17:42:57 j4px16+n.net
タプルの分解は構造化束縛でだいぶ楽になったけど使わない変数を読み棄てる機能も欲しい
int main(){
const std::tuple<std::string_view, int> person("nanashi", 35);
const auto [name, age] = person;
std::cout << "name:" << name << ", age:" << age << std::endl;
return 0;
}
258:デフォルトの名無しさん
20/04/10 19:35:38 Ekk6JBhA.net
タプルなんて小規模のちょこっとしたプロトタイプコードのときは
楽だなんておもうけど、きちっとした巨大なコードに仕立て上げていく経過で
結局ふつうにちゃんと構造体なりを定義してそれ返すようにしないと後々
混乱しかないのが見えて結局こんなのイラネーな、ってなる
259:デフォルトの名無しさん
20/04/10 19:38:38 1+J64Tmd.net
都会つってもアーバンライフが理想だったりするんだよね
最先端とは言わなくても整った街並み統一された景観
中心部は新旧入り混じったごみ溜めみたいなもん
流行に飛びついてつまみ食いするだけのが最悪
260:デフォルトの名無しさん
20/04/10 19:48:45 JXOjZTrq.net
タプルはそういう風に使うものじゃないんだが。
261:デフォルトの名無しさん
20/04/10 19:50:40 nPD3giIX.net
タプルは雑多な多値を返したいときが本来の目的
メタプログラミングでも活躍するけど
262:デフォルトの名無しさん
20/04/10 19:54:34 JXOjZTrq.net
使い方のわからない初心者が要らないというが、必要ないなら標準に入るわけがない。
263:デフォルトの名無しさん
20/04/10 20:30:00 L+h9leRf.net
>使い方のわからない初心者
自己紹介乙
264:デフォルトの名無しさん
20/04/10 21:14:38 n33I9Qyf.net
>>225
ありがとうございます。
リンクと丁寧な説明、大変助かりました。
265:デフォルトの名無しさん
20/04/10 22:48:19 uiBwCqn7.net
タプルはどっちかというと無名クラスそのものな印象
なので>>249に1票を入れたい
さらに言うとC++ではラムダ式の引数にもポインタを渡せるし、
[&]で呼び出し元変数の書き換えもできるしで
ラムダ式との絡みでもタプルという機構はそこはかとなく重畳な印象
、
266:デフォルトの名無しさん
20/04/10 22:53:18 uiBwCqn7.net
ゼロコストのための手段の品揃えが良いのはいかにもC++だが
JavascriptやPythonに似せる方向性の努力はC++的では無い
キモス
267:デフォルトの名無しさん
20/04/10 22:58:05 nPD3giIX.net
貪欲に何もかも狙うのこそがc++だろ
268:デフォルトの名無しさん
20/04/10 23:05:23 uiBwCqn7.net
なんじゃそりゃC++はプログラミング言語界のPerlでも目指しとるんか、
269:デフォルトの名無しさん
20/04/10 23:07:46 uiBwCqn7.net
というのは半分は冗談で、
スレッド安全のために関数からはオブジェクトのコピーを返したいのだが
オブジェクトのクラスをいちいち定義したくない、と言う場合には多少便利
270:デフォルトの名無しさん
20/04/10 23:16:09 TvpFDEko.net
時代はjavascriptとPythonだからねー
キミたちより意識高いし「デキる」人多いよ
271:デフォルトの名無しさん
20/04/11 00:30:10 A+Eh5Xi3.net
ランタイム速度落とさずに高級なことできるならなんでもやるがc++だろ
272:デフォルトの名無しさん
20/04/11 02:03:39.02 cUls8f/E.net
>>261
最近多いんだよねー
JavaScriptやPythonとかちょっとかじった程度で
「俺プログラマーやってます」って顔する子
最初の入り口が動的型付け言語なんだよね最近の子って
そんなもんじゃ使いものにならねっての
273:デフォルトの名無しさん
20/04/11 13:49:47 ksChGfzp.net
あほくさ
274:デフォルトの名無しさん
20/04/11 14:12:14 U1tTiVMl.net
いつの時代にもいるもんだよ
CでPascalっぽいコード書くような手合いは
275:デフォルトの名無しさん
20/04/11 14:15:59 xAZRHMqH.net
アカネチャン
276:デフォルトの名無しさん
20/04/11 14:17:00 xAZRHMqH.net
でも、constexprの使い道もわからないようじゃC++の意味ないのでは。
豚に真珠。
277:デフォルトの名無しさん
20/04/11 14:20:49 P/JT/wuI.net
CひいてはC++の需要が無駄に高まってきてるのは、一つは競技プログラミングのため、もう一つはpythonのためだ
278:デフォルトの名無しさん
20/04/11 14:30:47 xAZRHMqH.net
競技プログラミングに何故C++を使うのか?
279:デフォルトの名無しさん
20/04/11 14:41:37 gbVtYUoz.net
>>267
>constexprの使い道もわからない
誰と戦ってるんだ
280:はちみつ餃子 ◆8X2XSCHEME
20/04/11 14:42:19 iCsifmaF.net
>>269
単純に速い。
281:デフォルトの名無しさん
20/04/11 15:00:39 xAZRHMqH.net
>>270
らぶりーさまーちゃん。
282:デフォルトの名無しさん
20/04/11 15:38:18 XnsLNB9H.net
学術の巨大掲示板群 - アルファ・ラボ
URLリンク(x0000.net)
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
283:デフォルトの名無しさん
20/04/16 13:35:18.13 VLcNbPWE.net
RTTIをプログラムの一部で使用した場合
使用していない部分でもRTTIを有効にしたデメリット(実行速度など)の影響を受けますか?
284:デフォルトの名無しさん
20/04/16 18:37:14 ojSHK+XP.net
はい
285:デフォルトの名無しさん
20/04/16 20:13:11 4a+SNA6K.net
RTTIって何だっけ要るときになったら確保とかいうやつだっけ
286:デフォルトの名無しさん
20/04/16 22:00:12 ojSHK+XP.net
dynamic_castとtypeidを使う時に必要な機能
287:デフォルトの名無しさん
20/04/17 01:51:17 675DQ/0u.net
>>274
実行速度は実際に使うところにしか影響ないと思う。
バイナリサイズの面でのデメリットはRTTIを有効にしてコンパイルしてたら使わなくても発生すると思う。
288:デフォルトの名無しさん
20/04/17 10:38:52 xoWFQBId.net
バイナリサイズなんか見りゃわかるのにな
289:デフォルトの名無しさん
20/04/17 12:21:47 ojp4wJFZ.net
C++の設計思想としては
Cで同じコードを書けば同じ速度、リソース
290:で実行出来るのを目指している で基本的には思想通りに仕上がってる
291:デフォルトの名無しさん
20/04/18 02:08:36.18 MF/MkUpw.net
関数形式のキャストってあるじゃん
int(a)みたいの
これのlong long版ってあるの?
スペースを含んでいるのだが(笑)
292:デフォルトの名無しさん
20/04/18 02:19:16 kdY61W0J.net
(long long)(x)
293:デフォルトの名無しさん
20/04/18 03:10:07 qNMUbfyc.net
>>282
実は、コンパイラからすれば、それは、旧来のC形式の
(型名)値
の形式のキャストとみなされている。
294:デフォルトの名無しさん
20/04/18 03:11:31 qNMUbfyc.net
>>283
(TYPE)x // 原初的なCから存在していた旧来のキャスト形式
TYPE(x) // C++ で追加された関数形式のキャスト
295:デフォルトの名無しさん
20/04/18 04:06:49.73 ci0mR+IB.net
reinterpret_castな
296:デフォルトの名無しさん
20/04/18 04:16:44 8yR++2ZI.net
>>281
typedef long long long_long_type;
using alias_ll = long long;
てな感じに別名をつけたらどうだろ。
297:デフォルトの名無しさん
20/04/18 06:55:36.12 x+kfoWax.net
>>281
static_cast使え
298:デフォルトの名無しさん
20/04/18 07:27:51.97 jy7ENsJ8.net
std::intmax_t(a)だろ
299:デフォルトの名無しさん
20/04/18 12:36:01 msudwh4N.net
関数形式のキャストって、キャスト演算子をオーバーロードするとき
間接的にしかお世話になってない希ガス、
旧来のキャスト形式に対して他になんかメリットあんの?
300:デフォルトの名無しさん
20/04/18 12:39:19 gzWZknQs.net
コンストラクタによる変換と一貫してて見やすい(個人差があります
301:デフォルトの名無しさん
20/04/18 13:54:50.01 lQefZc9Y.net
>>289
コンストラクタとの一貫性を持たせることでtemplateを書くときに何か都合がいいとどこかで読んだ気がするが、うろ覚えなので間違ってたらスマン
302:デフォルトの名無しさん
20/04/19 19:48:59 /iMmv/v9.net
printfで標準出力に一行づつ出力するのが面倒なので、複数行をビアドキュメントで出力したいのですが、何か方法はありますか?
303:デフォルトの名無しさん
20/04/19 20:27:57 X1m2vVHB.net
>>292
printf(
"hhhh"
"jjjj"
"kkkk"
"llll"
);
304:デフォルトの名無しさん
20/04/19 20:39:55 t9NoLnqH.net
>>292
printf(
R"(hhhh
jjjj
kkkk
llll)");
305:デフォルトの名無しさん
20/04/19 23:27:06 /iMmv/v9.net
>>293,294
どちらも出来ました!
ありがとうございます。
306:デフォルトの名無しさん
20/04/20 10:40:59 gGVXVDIS.net
複数行ってそういう意味か?ω
出力は改行せんでええんか?ωωω
307:sage
20/04/20 14:01:38 H+0bMHyU.net
絶対に大丈夫なやり方は、こう :
printf(
"xxxx\n"
"xxxx\n"
);
308:デフォルトの名無しさん
20/04/20 14:31:21 8N3nnwLC.net
絶対に大丈夫とは?
309:デフォルトの名無しさん
20/04/20 23:26:51 7b1yqLmK.net
ドキュメント
310:デフォルトの名無しさん
20/04/22 13:20:56.58 v2BILLR9.net
URLリンク(ideone.com)
g++とclで結果が違う
ideoneではエラー
どれが正しい?
311:デフォルトの名無しさん
20/04/22 13:21:38.64 v2BILLR9.net
あ、ideoneじゃないcodepad
すまん
312:デフォルトの名無しさん
20/04/22 13:45:29.47 naSkUAWb.net
URLリンク(ideone.com)
URLリンク(stackoverflow.com)
313:はちみつ餃子
20/04/22 14:11:59.93 x0z1Sb8H.net
>>300-301
スコープ無し列挙定数は全ての列挙子の値を表せる整数型が基底になる。
ただし、全ての列挙子の値が int か unsigned int に収まるならば int より大きくなることはない。
この場合は int で表せないのでもっと大きい型にしたいけど最大の整数型である long でも
表せないのでお手上げって言ってる。
codepad は gcc 4.1.2 を使ってる。
つまりその時点での最新仕様は C++03 で、C++03 には long long なんていう型はない。
long 型が最大の整数。
(実際には処理系の拡張として __int64_t という名前で 64bit 整数も使えたりはするんだけど、
enum 関連で使用されるようにはなってないっぽい。)
314:デフォルトの名無しさん
20/04/22 16:04:43.48 v2BILLR9.net
>>303
レスthx
clはデフォC++14なのでlong longがあるはずなのに
何でtest2がlong止まりなのって話
std::cout << typeid(test2).name() << std::endl;
とやってみても
enum `int __cdecl main(void)'::`2'::<unnamed-enum-test2>
となるだけでlongかどうかは確認できない
さらに
void func(int) { std::cout << "int" << std::endl; }
void func(long) { std::cout << "long" << std::endl; }
これだと出力がintになる
315:はちみつ餃子
20/04/22 17:35:14.20 x0z1Sb8H.net
>>304
> clはデフォC++14なので
cl っていうと Common Lisp を連想してまう……というのは余談として、
それは動作環境を用意できてないからこっちで実行できへんのや。
結果が違うってのはどうなるの?
実行結果も示してくれへん?
あと 64bit 版か 32bit 版かも明示してや。
> longかどうかは確認できない
列挙型はあくまでも個別の列挙型であって整数ではないので、
基底型が何かというのは std::underlying_type で調べる必要がある。
316:はちみつ餃子
20/04/22 17:39:14.29 x0z1Sb8H.net
godbolt で確認しようとしたら
LINK : fatal error LNK1104: cannot open file 'libcpmt.lib'
と出るんやが……
317:デフォルトの名無しさん
20/04/22 17:47:08.07 v2BILLR9.net
>>305
Visual Studioと言えば通じる?
underlying_typeか、こいつは情報ごっつぁん
std::cout << typeid(typename std::underlying_type<decltype(test2)>::type).name() << std::endl;
これの出力もintだった
318:はちみつ餃子 ◆8X2XSCHEME
20/04/22 18:05:31 x0z1Sb8H.net
>>307
> Visual Studioと言えば通じる?
コマンドが cl というのは知ってはいるんだけど、コンパイラの名前として cl っていうのは伝わり難いと思う。
マイクロソフトのドキュメントでは Microsoft C++ か MSVC という書き方をしていることが多いようなので、
たぶんそれが公式な呼び方なんじゃないかな。
> これの出力もintだった
値は何になってる?
319:デフォルトの名無しさん
20/04/22 18:08:15 v2BILLR9.net
値はもうあんまり興味なかったが
一応試したらやっぱり0だった
320:はちみつ餃子 ◆8X2XSCHEME
20/04/22 18:26:25 x0z1Sb8H.net
>>309
バグとして報告が出てたわ。
URLリンク(developercommunity.visualstudio.com)
結論: MSVCのバグ。 gcc や clang が正しい。
321:デフォルトの名無しさん
20/04/22 23:26:04 CBtGJth1.net
き、君子危うきに近寄らず…!
322:デフォルトの名無しさん
20/04/22 23:37:02 i2NtNOZ9.net
キミコってボトムズの主人公いたね
323:デフォルトの名無しさん
20/04/22 23:46:36 mtNioQDL.net
キミコ・ビューティフルだったか
324:デフォルトの名無しさん
20/04/23 11:30:41.04 StmE//V5.net
>>310
よくこんなの見つけたな
指摘からもう1年経つのにまだ放置か
325:デフォルトの名無しさん
20/04/23 12:32:25 GqVREd4h.net
>>314
VS2013だし放置じゃね?
326:デフォルトの名無しさん
20/04/23 13:12:45 StmE//V5.net
300で言ってたclは2019だよ
もち更新ちゃんとやってるやつ
327:はちみつ餃子 ◆8X2XSCHEME
20/04/23 13:27:01 Fyt21a0c.net
>>315
最新のコメントに `_MSC_FULL_VER` が `192328105` の環境で再現すると書いてある。
これは Visual Studio 2019 version 16.3.2 のことだそうな。
URLリンク(cpprefjp.github.io)
328:デフォルトの名無しさん
20/04/23 14:02:24 GqVREd4h.net
あーすまん、ちゃんと見てなかった
2019でも起きるのに一年放置は長いな
型指定使えば済むやろ、で後回しにされてるのかも?
329:デフォルトの名無しさん
20/04/23 17:39:32.10 StmE//V5.net
だいたい出尽くした?
餃子さん情報2つもありがとう
リアルならバーでおごるところだ
330:デフォルトの名無しさん
20/04/23 17:56:49 HERx4kEF.net
本当は、64bit型が追加されたことはコンパイラ作者泣かせなんだ。
C++コンパイラはとても複雑になってしまっている上に新しい仕様が入ったことで組み合わせ爆発が起きて細かなバグが入り易い。
331:デフォルトの名無しさん
20/04/23 18:03:51 HERx4kEF.net
型の「昇格」や、2項演算子における型の「統一」も、64bit型が入ったことで複雑さが増した。
普段当たり前すぎて気にしないことだが、
unsigned char ch = 1;
と書いた場合でも、右辺は最初 int 型整数と解釈されるが、型にうるさいC++においても、それよりバイト数の少ない ch に警告も無く代入できてしまう。
他にも、
ch += 2;
とした場合、2は、最初int型と解釈されるのに、それよりバイト数の小さい ch に何の警告も無く足せてしまう。
これらで警告が出たらコーディングの手間がかかり過ぎるためそうなっているとは分かるが、型安全なC++においては背後にどういう仕組みがあるのかと思ってしまう。
332:デフォルトの名無しさん
20/04/23 18:07:51.10 HERx4kEF.net
>>321
unsigned char ch = 1 + 2;
と書いたとする。
右辺は、C言語の使用によれば、1も2もint型だとみなされてから計算され、
結果の3もint型である。普通、int i; に対して、
ch = i;
とすると当然エラーか警告が出るのに、
この場合には何もメッセージが出ずにコンパイラが通るはずだ。
これも背後にどの仕様が働いているのだろうか?
333:デフォルトの名無しさん
20/04/23 18:18:19.96 /EdNitWt.net
char a = 0;
a += (char)0;
これも代入時にintから型変換
334:デフォルトの名無しさん
20/04/23 18:19:27.29 mq+N4KeF.net
簡単な定数畳み込みして安全かどうか調べてるだけでしょ
gccの場合
char i = 255+1; # warningでる
char i = 1;
char j = 255+j; # warningでない
335:デフォルトの名無しさん
20/04/23 18:20:26.60 /EdNitWt.net
1+2*3
は警告が出ないのに
1<<2+3
は警告が出るとか
色々と恣意的
336:デフォルトの名無しさん
20/04/23 18:27:20 mq+N4KeF.net
そりゃwarningだもの
コンパイラーごとに親切心でやってるだけじゃん
337:デフォルトの名無しさん
20/04/23 18:33:48 StmE//V5.net
>>324
自己初期化?
338:デフォルトの名無しさん
20/04/23 18:34:10 /EdNitWt.net
親切心じゃなくて趣味の押し付けみたいな物も多い
339:デフォルトの名無しさん
20/04/23 18:35:02 HERx4kEF.net
ch = 1;
がどうしてエラーにならないのか、CやC++の古い仕様仕様書からは見つけることが出来なかった。
340:デフォルトの名無しさん
20/04/23 18:35:11 mq+N4KeF.net
>>327
すまん
char j = 255+i; # warningでない
だった
341:デフォルトの名無しさん
20/04/23 18:35:53 mq+N4KeF.net
>>329
c++が型安全だとなぜ思った?
342:はちみつ餃子 ◆8X2XSCHEME
20/04/23 20:49:08 Fyt21a0c.net
>>329
古い仕様っていつのやつ?
とりあえず JISX3010:2003 (C99 に相当) を見る限りでは規定はある。
関連しそうなところを抜粋したので細かいことは周辺を確認してね。
> 6.7.8 初期化
> 型の制限及び型変換は、単純代入と同じとする。
> 6.5.16.1 単純代入
> 右オペランドの値を代入式の型に型変換し、左オペランドで指し示される
> オブジェクトに格納されている値をこの値で置き換える。
> 6.3.1.3
> 整数型の値を _Bool 型以外の他の整数型に変換する場合、
> その値が新しい型で表現可能なとき、値は変化しない。
> 新しい型で表現できない場合、新しい型が符号無し整数型であ�
343:黷ホ、 > 新しい型で表現しうる最大の数に 1 加えた数を加えることまたは > 減じることを、新しい型の範囲に入るまで繰り返すことによって得られる > 値に変換する。 > そうでない場合、すなわち、新しい型が符号付き整数型であって、 > 値がその型で表現できない場合は、結果が処理系定義の値となるか、 > 又は処理系定義のシグナルを生成するかのいずれかとする。 そんなわけで、変換後が unsigned の場合はどんな値に変化するか既定があるし、 signed の場合は表現できる範囲内では値は変化しないから問題ない。 表現できない値になってるかどうかは基本的に実行時までわからんから コンパイル時には黙って通す (わかるときは警告する) って感じ。
344:デフォルトの名無しさん
20/04/24 02:20:09 UPXGgu7R.net
>>332
> 右オペランドの値を代入式の型に型変換し、左オペランドで指し示される
> オブジェクトに格納されている値をこの値で置き換える。
C++において、
char ch;
int i;
に対し、
ch = i;
はエラーになるけど、それは左辺と右辺で型が違っているから。
つまり、C++では、単純代入演算子 x = y において、「型変換」は自動的には行われない。
345:デフォルトの名無しさん
20/04/24 02:23:37 UPXGgu7R.net
>>333
pure Cにおいても、
int x;
char *ptr;
x = ptr;
や
int *pInt;
char *ptr;
pInt = ptr;
は
どちらもエラーになる。
だから、pure C の代入演算子に置いても、型変換がエラーも出ずに自動的に行われるわけではない。
346:デフォルトの名無しさん
20/04/24 05:55:11 UB0Nvahs.net
>>333,334
「エラーになる」って言ってるけど、警告の間違いじゃない?
CでもC++でも代入で暗黙の型変換は発生するよ。
347:デフォルトの名無しさん
20/04/24 07:54:02 Sh3Vy8vg.net
>>333
なんでそんな自信満々なん?これコンパイル通るぞ
int main(){
char ch = 0;
int i = 1;
ch = i;
std::cout << +ch << std::endl;
return 0;
}
348:デフォルトの名無しさん
20/04/24 10:31:54 FFBNt2WC.net
unsigned char のときだな
349:はちみつ餃子 ◆8X2XSCHEME
20/04/24 10:33:37 /uuSllCQ.net
>>333
初期化・代入のどちらにおいても int から char へは暗黙に型変換される。
URLリンク(timsong-cpp.github.io)
URLリンク(timsong-cpp.github.io)
URLリンク(timsong-cpp.github.io)
350:デフォルトの名無しさん
20/04/24 11:53:55 VnmHvJrT.net
エラーじゃなくてワーニングなんだろ多分
しっかりラーニングしておけよ
351:デフォルトの名無しさん
20/04/24 11:59:13 X9QPCPhF.net
c++は型安全おじさん誕生
352:デフォルトの名無しさん
20/04/24 12:36:28 TokoipqW.net
今月のインターフェースでC++は型なし言語と紹介されていた。
種なしって言われたみたいで悲しい…
353:デフォルトの名無しさん
20/04/24 14:00:39 om9P6Ux9.net
型があることにも、ないことにもできるのがC/C++の良いところ
まあしかし世の中には反りの合わない人がいるもので
そういうところを酷評する意見も当然出てくる
354:デフォルトの名無しさん
20/04/24 14:05:22 A9aEYiqd.net
c++が悪いんやない!cの型システムが壊れてるからや!
みたいな主張は聞いたことある。
まあしかし互換性がウリですからね。。
355:デフォルトの名無しさん
20/04/24 15:11:32 UPXGgu7R.net
むしろ、型を壊したのは C++ の方だと思うが。
autoとかで。
356:デフォルトの名無しさん
20/04/24 15:14:13 UPXGgu7R.net
>>335
C++では、
void *ptr;
CPerson *pPerson;
に対して、
pPerson = ptr;
はエラーになるはず。
だから、C++では
CPerson *pPerson = malloc(sizeof(CPerson));
がエラーになるのだから。
pure Cではならなかったが。
また、
CBase *pBase;
CDerived *pDerived;
に対して、
pDerived = pBase;
もエラーになるはずだ。
357:デフォルトの名無しさん
20/04/24 15:15:40 UPXGgu7R.net
>>343
何か勘違いしているようだが、人気が有ったのはpure Cの方だからね。
今のC++の人気は、pure Cの人気を引き継いだだけ。
そしてC++が変な拡張を繰り返したからこそ、人気にかげりが見えてきている。
358:デフォルトの名無しさん
20/04/24 15:16:31 om9P6Ux9.net
>>344
autoは型をきちんと理解して使うもので
アホが使うと謎の動きに翻弄されることになる
359:デフォルトの名無しさん
20/04/24 15:19:58.74 TokoipqW.net
>>346
そのコメント
360:343宛でよいの?
361:デフォルトの名無しさん
20/04/24 16:02:04 3fWjsT92.net
autoは要らない子
362:デフォルトの名無しさん
20/04/24 16:06:41 h2kPOcUM.net
auto使ってない人なんて実在するのか?
363:デフォルトの名無しさん
20/04/24 16:22:47 UPXGgu7R.net
>>341
どう書いてあったか詳しく聞いてみたい。
364:デフォルトの名無しさん
20/04/24 17:35:30 UB0Nvahs.net
>>345
何で別の話を始めたの?
ちゃんと質問には答えてくれないかな?
365:はちみつ餃子 ◆8X2XSCHEME
20/04/24 17:42:51 /uuSllCQ.net
>>344
型検査の厳しさは型を陽に書くかどうかとは関係ない。
>>345
何をいいたいのかわからん。
366:デフォルトの名無しさん
20/04/24 18:14:30 UPXGgu7R.net
>>353
馬鹿ですか?
367:デフォルトの名無しさん
20/04/24 18:22:23.35 JqJmAzM2.net
>>354
何で>>345で別の話を始めたの?
ちゃんと人の質問には答えようね
368:デフォルトの名無しさん
20/04/25 07:51:21.81 McBhOj36.net
>>351
コンパイル時にすべての変数の型が確定しないc++は弱い型付けだから型無し言語に分類だって。
369:341
20/04/25 09:43:58 qEMV8mRo.net
>>356
そこは動的型付けの説明だよ。
ちゃんと読んで
370:デフォルトの名無しさん
20/04/25 11:27:52 nL0CusKX.net
5月号のこと?
371:デフォルトの名無しさん
20/04/25 11:29:47.36 4nLfPOGM.net
トラ枝?
372:デフォルトの名無しさん
20/04/25 11:29:54.96 nL0CusKX.net
>>357
その雑誌には、
静的型付け言語であるところの C++ が「型無し言語」であると書いてあるの?
373:デフォルトの名無しさん
20/04/25 19:17:45 45wIze2e.net
アムウェイで地味に成功してた僕が業界の裏側を暴露してみた
URLリンク(www.youtube.com)
年間300万円稼げてたのにアムウェイをやめた理由
URLリンク(www.youtube.com)
【体験談】元DDがAmwayで稼ぐのが難しい理由を解説してみた【元ガチ勢】
URLリンク(www.youtube.com)
【借金地獄】マルチ商法で死の淵から生還して得たもの失ったもの【ビジネス論】
URLリンク(www.youtube.com)
あの頃アムウェイはじめちゃったきっかけ【元ガチ勢】
URLリンク(www.youtube.com)
私がネットワークビジネスを勧めない理由とは?
URLリンク(www.youtube.com)
374:デフォルトの名無しさん
20/04/25 19:26:23 siKm6MFQ.net
>>361
グロ
375:デフォルトの名無しさん
20/04/25 19:45:42 zwQe2okb.net
auto it = unique(
vecVisibilityPolygonPoints.begin(),
vecVisibilityPolygonPoints.end(),
[&](const tuple<float, float, float> &t1, const tuple<float, float, float> &t2)
{
return fabs(get<1>(t1) - get<1>(t2)) < 0.1f && fabs(get<2>(t1) - get<2>(t2)) < 0.1f;
});
vecVisibilityPolygonPoints.resize(distance(vecVisibilityPolygonPoints.begin(), it));
のresize()から意味がよくわからないのですが、
{0.1, 0.11, 0.2, 0.21, 0.4, 0.41}
↓
{0.1, 0.2, 0.4}
なことでしょうか?
376:デフォルトの名無しさん
20/04/25 20:03:25.46 NvgVRl2l.net
>vecVisibilityPolygonPoints
std::vector<T>のハンガリアン記法での接頭辞vecで良いんだっけ…
Tの情報はどう埋め込めば良いんじゃ…
毎回悩むのでJISか何かで決めてホスイ
377:デフォルトの名無しさん
20/04/25 20:32:53.50 /7S9hKw7.net
erase使わずにresize使う人始めてみたわ
378:デフォルトの名無しさん
20/04/25 22:11:42 NvgVRl2l.net
>erase使わずにresize使う人始めてみたわ
ハア?(゚Д゚)ハァ?
379:デフォルトの名無しさん
20/04/25 22:34:29 siKm6MFQ.net
>>364
vecなんて付けずにvisibilityPolygonPoints でいいんじゃね。システムハンガリアンは不要または有害だと言われるようになって久しいだろう。
処理の都合上、別のコンテナからvectorに詰め替えたとかでvectorであることに強い意味がある状況なら、vecをつけて元の変数と区別する意味はあると思うけど。
380:デフォルトの名無しさん
20/04/25 22:56:50 WEavO2K3.net
auto使ってハンガリアンとかなんか間違ってるわな。
381:デフォルトの名無しさん
20/04/25 23:00:45 /7S9hKw7.net
確かにvectorだと処理量変わらんな
382:デフォルトの名無しさん
20/04/25 23:11:24 /7S9hKw7.net
>>363
3要素のvectorでyzの値が近いものを同一と見なして削除する処理なのかね
unique前のsortどうしてんのか謎だけど
uniqueは重複したものは一つだけ残して前にuniqueなデータを集め、後半にゴミを集める
戻り値はゴミの開始iterator
resize部分はゴミを消す処理
一般的にはerase使ったerase-remove_ifイディオムの変形だな
383:デフォルトの名無しさん
20/04/25 23:12:19 /7S9hKw7.net
ポリゴンだからソートする必要ないのか
384:デフォルトの名無しさん
20/04/26 00:08:03.75 PBJtHpgo.net
使ったこと無いから知らんがstd::unique<T>()は
>削除は、消去される要素が上書きされるように、範囲内の要素をずらすことによって行われます。
とのことなので、callerがstd::unique<T>()を呼ぶ前にソートしておく必要があるのでは…
385:デフォルトの名無しさん
20/04/26 00:15:41.29 tEMTnANK.net
>>370
unique前にソートで昇順にしているみたいです。
386:デフォルトの名無しさん
20/04/26 00:30:35 NFXmWZjN.net
結局メモリーポインタ関連わかってない奴はガベコレなんかで隠ぺいした言語使っててもバグる
387:デフォルトの名無しさん
20/04/26 03:23:30.98 3JmljcZq5
東大院生と本気数学トーク!!【数学ボーイZ 数学野郎さんコラボ】
URLリンク(www.youtube.com)
中3で数Ⅲ先取り!? 京大数学系YouTuber古賀さんに開成中高時代を聞く!
URLリンク(www.youtube.com)
開成から京大理学部に進学した理由とは?古賀さんに京大の実態を聞く!
URLリンク(www.youtube.com)
高校数学と何が違うの?大学数学でつまずかないためのアドバイス![大学数学準備講座1/4]
URLリンク(www.youtube.com)
数学は「定義」にかえることが大事!
URLリンク(www.youtube.com)
数を創る話〜自然数から複素数への構成〜
URLリンク(www.youtube.com)
高校生でも雰囲気だけ分かるガロア理論
URLリンク(www.youtube.com)
高校生でも雰囲気だけ分かるゼータ関数とリーマン予想
URLリンク(www.youtube.com)
【高校生でもわかる】いろいろな積分 リーマン,ルベーグ...
URLリンク(www.youtube.com)
大学で本気で学問をしたい人へのアドバイス
URLリンク(www.youtube.com)
388:デフォルトの名無しさん
20/04/26 05:15:56 mQCdU9mn.net
vecVisibilityPolygonPoints が「1枚のポリゴンの各頂点の座標(頂点数は任意)」で
座標値は画面に表示すべき値に変換済み(透視投影が完了している)、
<float, float, float> が (x, y, z) を表すと仮定すると…
隣合う頂点のx座標同士、y座標同士がそれぞれ十分に近ければ
その「極端に短い一辺」を1つの頂点とみなして表示処理を軽減、って感じかな。
resize() の結果 size() が 1 か 2 になったらポリゴン全体が
「見えないポリゴン」になるので丸ごと省略、までやるかも。