結局C++とRustってどっちが良いの?

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2023/02/25(土) 09:49:46.74ID:VRyB88xR
C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな?
628デフォルトの名無しさん
垢版 |
2023/03/27(月) 19:22:16.60ID:dqg9sWUs
Rustで仕事してないやつらばかりだの
儲かるから流行るんだぞ
2023/03/27(月) 19:23:51.08ID:IKh8n5QH
既存のものを移植するのは無駄な行為
既存のものはそのまま使えば良くそのまま使われている
新たなものはRustになっている
それだけの話
2023/03/27(月) 19:25:47.39ID:ZBCIgMCl
Rustの仕事あるかい?
2023/03/27(月) 19:33:28.90ID:byKu+Dgz
>>627
rustもキラープロダクトが出れば一気に普及する
2023/03/27(月) 19:43:52.09ID:f4PBXzjX
>>622
節電というか、こちらはクラウド利用だけど間接的には当たりじゃね?
GC言語からRustへだけど、CPUコストとメモリコストが激減、だからクラウド側では節電となり、Rustはエコ。
GCなく自動メモリ解放する言語Rustの出現が今までの流れを変えた。
2023/03/27(月) 20:10:16.56ID:eSmIEcJi
Rustへの動きは2系統あるよな
C/C++からRustへの安全性を高める動き
GC言語からRustへの高速化&省メモリ化の動き
まれに片方の動きの意識しかない人が想像力の欠如した書き込みをしている
2023/03/27(月) 20:59:51.90ID:f2pr1T08
目的は1つだけ・手段はいくらでもあるという世界観はしつこく宣伝されてきた
逆に1つの道具で色々できるという話はあまり聞かない
2023/03/27(月) 21:16:18.71ID:ztwrSg39
Rust製のTurbopackでjsのバンドルが数百倍高速になってもじゃあ俺もRust使おうとはならんのよ
AWSのバックエンドでRust使ってエネルギー効率が向上してもじゃあ俺もRust使おうとはならんのよ

理性的に考えろ
636デフォルトの名無しさん
垢版 |
2023/03/27(月) 21:18:03.30ID:CXyrf6Yu
オジの自演は特徴出すぎで草
こちらはクラウド利用www
2023/03/27(月) 21:25:42.06ID:B8NoQCc/
Windows3.1からMacOSにも流れなかったし
Cのニッチェを奪わなければRustはこの先生
きのこれない
638デフォルトの名無しさん
垢版 |
2023/03/27(月) 21:59:50.76ID:dqg9sWUs
アンチは願望ばっかだな
エンジニアの上澄が認めたのだから争っても無駄
639デフォルトの名無しさん
垢版 |
2023/03/27(月) 22:10:09.18ID:B8NoQCc/
>>638
儲かってる人キタ━━━━(゚∀゚)━━━━!!
Rustで何開発してるの?
2023/03/27(月) 23:10:41.22ID:6TNfXJr3
>>608
Rustの提唱するパラダイムがうまくいきだしたら、他言語もこぞって取り込むと思う
アカンとなったら、次のパラダイムが提唱…されるのは先の話だろうなあ 俺生きてるかなまじで
2023/03/27(月) 23:13:47.59ID:xSQDJ/La
js、ptyhon、やってきて
rustは新鮮で学べてるけど
c++はやばくね、、、
依存やらのコンパイルの時点で挫折しそうなんだが
ドキュメントもわけわからんし
2023/03/27(月) 23:20:50.21ID:B8NoQCc/
>>640
所有権って途中から取り込めるの?
パターンマッチングとかは余裕だろうけど
643デフォルトの名無しさん
垢版 |
2023/03/27(月) 23:43:11.84ID:Y8evRbQy
余裕だろ
ただ他言語もこぞってと言ってもGC言語は対象外なのでメジャーな言語で可能性があるのはC++のみ
2023/03/27(月) 23:51:52.30ID:B8NoQCc/
>>643
デフォルトでコピーコンストラクタやコピー代入演算子が起動するところを
moveコンストラクタやmove代入演算子が起動するように変更するってことでしょ?
余裕な訳ないじゃん
copy by valueな言語では後方互換性が犠牲になるので導入無理だよ
645デフォルトの名無しさん
垢版 |
2023/03/28(火) 00:23:27.41ID:Q1TWiepd
>>644
いろんなやり方があるけど実装ができないようなものはない
やろうとすればどのやり方にするのがいいか
細かい仕様をどうするのがいいか
そういう意思決定に時間がかかるだけ

所有権システムをあとから取り込めないなんて発想をする人がRustを宣伝してるのがむしろ驚き
646デフォルトの名無しさん
垢版 |
2023/03/28(火) 00:42:21.55ID:ecLsJgbH
>>645
文章読めないのかな?
今まででのコードでインスタンスがコピーされるところを
勝手にmoveにすり替えられたら大惨事だろw
今まで書いたコードを全部書き換えることになる
つまり後方互換性が犠牲になる
C++の開発当初からの方針で最大の特徴はCを内包していること
CもC++もcopy-by-valueな言語
647デフォルトの名無しさん
垢版 |
2023/03/28(火) 00:54:04.89ID:9+wNikJy
視野の狭い人だな
2023/03/28(火) 01:08:09.67ID:ecLsJgbH
>>647
問題についてどう解決するかを書きな?
2023/03/28(火) 01:35:54.97ID:m2o7Qw0d
既にCとC++に互換性はない
しかし許された
また同じことをやってまた許されることは可能かもな
2023/03/28(火) 01:46:32.83ID:ImlVuHSq
まあ拡張子変えれば許されるよcpoとか
あとはsafeブロックとか?
2023/03/28(火) 02:00:41.86ID:ecLsJgbH
>>649
ほぼ互換性あるだろ? どういったケースのこと書いてるの?
652デフォルトの名無しさん
垢版 |
2023/03/28(火) 02:21:00.53ID:gbUXYbOA
>>626
新規プロジェクトって例えばどれよ?
653デフォルトの名無しさん
垢版 |
2023/03/28(火) 02:21:41.39ID:gbUXYbOA
>>628
なんの仕事してんの?
654デフォルトの名無しさん
垢版 |
2023/03/28(火) 02:22:00.97ID:WlqhC76+
>>644
>デフォルトでコピーコンストラクタやコピー代入演算子が起動するところを
>moveコンストラクタやmove代入演算子が起動するように変更するってことでしょ?
アフォ発見!
655デフォルトの名無しさん
垢版 |
2023/03/28(火) 02:24:01.41ID:gbUXYbOA
>>641
オブジェクト指向できてないからだろそれ
C#学べ
2023/03/28(火) 02:25:39.63ID:6yQ3WRoT
>>642
パターンマッチング導入はC++23でも無理
出てる案では便利になりそうにない
こればっかりは結果論になってしまうがRustと比較するとこれまでの基本設計が失敗してる
2023/03/28(火) 02:31:45.17ID:6yQ3WRoT
>>644
現状のスマポとmoveを用いたC++の所有権システムはRustのシンプルな記述と比べると面倒で忘れたりミスしたりしてしまうがあれが限界っぽい
後方互換性を保ったままC++を快適にするのは不可能
2023/03/28(火) 02:43:54.99ID:6yQ3WRoT
>>655
そいつが書いている3つの言語ともにオブジェクト指向なのでC#は不要だろう
Pythonは普通
JavaScriptはプロトタイプ方式の継承だがそれ以外は普通
Rustは継承を排除していて機能(メソッド群)毎にトレイトで合成するがそれ以外は普通
659デフォルトの名無しさん
垢版 |
2023/03/28(火) 03:31:25.51ID:gbUXYbOA
>>658
Pythonやってるやつはオブジェクト指向理解できてないやつ多いよ
JavaScriptはまぁ基本使わんし
Rustはオブジェクト指向的なことできるようにしてるけどオブジェクト指向わからんやつ向けに制限かけてるって印象
2023/03/28(火) 05:56:18.37ID:uty8q6BB
複雑になりすぎないようにするのは、それはそれでメリットでもある
C++では、やたらとややこしいクラスが上がってくる
それ〇〇使いたいだけちゃうん、みたいな

Rustが普及したら、Rust流のスマポにみんな慣れるから、自分の母語でも使うようになるよ
2023/03/28(火) 06:40:30.67ID:qh0NVSBO
>>659
その3つの言語をやってることから例えばウェブ方面だとしても
PythonでDjangoなどのフレームワークを使うにはオブジェクト指向は基本知識として不可欠
JavaScriptもReactなどののフレームワークを使うにはオブジェクト指向は基本知識として不可欠
Rustに対してはデタラメな印象だけで基礎的な理解すらなし
このスレで連投してる人の中で最もレベル低すぎ
2023/03/28(火) 06:47:56.40ID:uty8q6BB
C++のOOPって、CRTPとかがすっと書ける、読めるレベルだからねえ
そんな難しくないけど、美しく書くには多少の経験は必要

あと、吐かれるコードにはもうちょい気を留めてほしいなと、マシン語寄りの俺は思っちゃうな
「そういう」用途ばっかりじゃないのはわかるんだけど
2023/03/28(火) 07:05:58.21ID:uty8q6BB
そういや気にしてなかったけど
webも、APIがOOP式で提供されてるから、OOP無関係とは言えないけど、
自分でどんどんクラスを編み出して問題解決するC++とは、OOPに向かう姿勢は異なってくるね

クラスは簡潔なほうが、結局効率もいいんだけどねw
2023/03/28(火) 07:15:22.07ID:qh0NVSBO
>>663
それはPythonでもJavaScriptでも同じ
Web APIと関係なくプログラム独自の部分も自分でどんどんクラスを編み出して問題解決する
他を知らないためC++だけを何か特別だと思い込んでそうだな
2023/03/28(火) 07:20:37.19ID:uty8q6BB
>>659 をちょっとだけ擁護してみたくなっただけだよw
どこだって、ライブラリ作成者はOOPに精通してるもんだが、
C++は、OOPに精通してないと、使ってますとか公言できないもんね
むっちゃ煽られるよw その違いはあるなって思った
2023/03/28(火) 07:41:04.68ID:qh0NVSBO
OOPは精通するしないとか難しいものではないだろ
初心者かね
2023/03/28(火) 07:49:36.20ID:uty8q6BB
C++でOOPができるといったら、当然のようにSTLが使え、boostが使える
あるいは、traitsやattribute,constexpr を織り交ぜて、ほぼゼロサンクなバイナリを叩き出せるレベル
俺は初心者だからそのレベルにはないな

ちょっとよそよりは要求レベルは高いだろって思ってる
母語のことはちょっとだけ誇りに思ってるけど、それより、一長一短的立場
2023/03/28(火) 08:58:26.51ID:C7yLEzi8
上のほうでだれかいってたけど、まともなC++erは、スマポくらい使えて当然
なんだけど…ソース単位で生ポ禁止ってのが普及しないんだよね
2023/03/28(火) 09:04:22.01ID:u9f8RzdU
newを書かなきゃ良いだけなのにね
670デフォルトの名無しさん
垢版 |
2023/03/28(火) 09:37:27.95ID:fedCMYV9
>>661
嫌だからわかってないんだってばこいつはさ
だからC++の依存関係で頭パンクすんだよ
671デフォルトの名無しさん
垢版 |
2023/03/28(火) 09:39:21.00ID:fedCMYV9
とりあえず
>>641
こいつがオブジェクト指向理解してないのは確かだろ
672デフォルトの名無しさん
垢版 |
2023/03/28(火) 09:56:21.67ID:cZnvlJgt
>>661
君がオブジェクト指向理解できてなさそう
2023/03/28(火) 10:06:33.49ID:C7yLEzi8
>>669
C++も なんでもスタックに置きたいんだけど、きつきつなのが本来なんだよね
どんどんスタックを食うのは野暮っていう流儀もある

Rust流はメモリ使用の局所化を促進するから、
メモリキャッシュまで考慮すると、悔しいけどC++より効率出る余地がある
まあ実測してみないと、知らんけどw
674デフォルトの名無しさん
垢版 |
2023/03/28(火) 10:06:36.56ID:vBvHBfxi
>どんどんクラスを編み出して問題解決する
奴はクラスを書けたらオブジェクト指向を理解してると思ってるみたいだからな
675デフォルトの名無しさん
垢版 |
2023/03/28(火) 10:09:59.68ID:fedCMYV9
>>674
確かになw
普通逆で一番抽象化できるところで遡ってツリー形式にやっていくもんだもんな
2023/03/28(火) 10:28:38.80ID:u9f8RzdU
>>673
「newを書かなきゃ」ってのは
make_uniqueとmake_sharedを使えって意味でした
2023/03/28(火) 10:51:13.90ID:P0df9Gxx
JavaScriptとPythonは
極力オブジェクト指向的な書き方をしないほうが
メンテナンス性も可読性も高まる言語だから
C++やC#とは事情が違うわな
2023/03/28(火) 17:06:18.21ID:aUMSgZvE
>>662
CRTPはC++のOOPで最も効率よい実装となり必須なテクニックであるが
美しいというのはウソでむしろC++の汚さの象徴の一つになっている

初心者や他言語の人たちもいるようだからわかりやすいコード
例として各派生のadd1()を用いて共通のadd2()やadd3()などを用意する場合

template<typename T>
struct AddN {
void add2() {
static_cast<T*>(this)->add1();
static_cast<T*>(this)->add1();
}
void add3 ...略
};

struct Foo : AddN<Foo> {
int x;
Foo(int i) : x(i) {}
void add1() {
this->x++;
}
};

以上となり慣れてしまうと感覚が麻痺してしまうが
CRTP (Curiously Recurring Template Pattern)の名の通り
「Foo : AddN<Foo>」といちいち自分をパタメータとして与えなければならない
「static_cast<T*>(this)」といちいちダウンキャストをしなければならない
このように「美しくない無駄なコード」になっている
つづく
2023/03/28(火) 17:07:43.55ID:aUMSgZvE
>>678のつづき
一方でRustではトレイトを用いて以下のコードとなる
C++での「美しくない無駄なコード」部分を消し去った状況とほぼ一致している

trait AddN {
fn add1(&mut self);
fn add2(&mut self) {
self.add1();
self.add1();
}
fn add3 ...略
}

struct Foo(i32);
impl AddN for Foo {
fn add1(&mut self) {
self.0 += 1;
}
}

逆にRustのこのコードと同じことを同じようにゼロコストで実現するには
C++ではCRTPを「美しくない無駄なコード」とはいえ使わざるをえない
2023/03/28(火) 17:58:49.48ID:C7yLEzi8
>>678-679
早まるな、俺は【CRTPが】美しいとは言ってない
初めて見たときは、なんじゃこりゃすげぇとは思ったけどねw
2023/03/28(火) 20:04:32.17ID:jfKwOIRn
>>679
CRTPを使わないで仮想関数にすると実行時のvtable経由のオーバーヘッドがあるんだよな
Rustは何も指定しなくてもCRTPと同じ状況になるから記述はシンプルで実行時オーバーヘッドもなく速いわけか
682デフォルトの名無しさん
垢版 |
2023/03/28(火) 20:17:15.74ID:fedCMYV9
そういえば初心者向けのサイト無いな
アイペンテックとか?
2023/03/28(火) 20:32:01.59ID:iKmwqFtY
C++のオブジェクト指向は動的ポリモーフィズムだから遅い
関数呼び出しのvtableオーバーヘッドがあるだけでなくインライン展開ができず最適化の機会も失われている
Rustは基本が静的ポリモーフィズムだからそれらのコストがなく速い
2023/03/28(火) 20:33:07.14ID:QUV/Fh6a
CRTP使うと全部インライン展開されるのマジで不思議だよな
2023/03/28(火) 21:00:58.63ID:HSIaJTs3
>>684
適当なことを言うと規格票で殴り殺される
それがC++村の掟
悪いことは言わない
君はここから早く撤退したほうがいい
686デフォルトの名無しさん
垢版 |
2023/03/28(火) 21:30:24.26ID:pvMX8JEc
>>627
Rubyの話はもういいよ
2023/03/28(火) 21:35:05.32ID:iKmwqFtY
>>684
CRTPを使えば常にインライン展開されるわけではない
CRTPを使った時のみ(vtable経由にならず静的に動作が確定するため)インライン展開が可能となり最適化の可能性も広がり速くなるという話
C++ではCRTPを使わないとRustと同等の速さになれない
688デフォルトの名無しさん
垢版 |
2023/03/28(火) 22:58:28.07ID:rZiXTukV
vtableが重く感じるとかどんな環境やねん。どうせエアプやろ。
2023/03/28(火) 23:08:36.42ID:u9f8RzdU
呼び出し回数多いと馬鹿にならんよ
2023/03/29(水) 00:01:28.04ID:jlgG+N1i
vtableが重いというよりインライン展開+αの最適化が効かなくなるのが問題なんでしょ
使ってる関数が常に固定値(nullとか)を返すって事前に分かればそれによって分岐の整理ができたりするけど
間にvtableが挟まるとそういう予測が難しくなる
2023/03/29(水) 00:09:55.54ID:jqKX3lj0
>>687
CRTPを使わないと真に実現できないのはメソッド記法だけ

そしてvtableとインライン展開に君が想像するような関係性は無い
というか、同じ推論をRustで適用すれば「object-safeなtraitへのimplはvtableを量産しインライン展開を阻害するので悪、やめろ」ということにならないかい?

自分が何を書こうとしているのかよく考えてから書き込むことだ
2023/03/29(水) 00:26:00.18ID:hbkToQM4
C++もRustも、OOPなアセンブラの用途があるからね
少々vtableを経ても平気だとしても、そういうバイナリ吐いてほしくないときはある
バイナリは覗かれるもの
693デフォルトの名無しさん
垢版 |
2023/03/29(水) 02:17:33.72ID:0e8thR9U
こういうしょーもない連中に限ってvtableによって速度が何%落ちるかなんて測ったこともないんだよ。
馬鹿馬鹿しい。
2023/03/29(水) 03:03:32.31ID:F3x5gAOr
>>688
vtableの参照による速度低下よりも最適化できないことによる関数呼び出しのコストが重い
例えば>>679のRust及びCRTPで書かれたC++コードはどちらもadd2()関数呼び出しの中身は最適化されて単なる「add 2」となる
しかしCRTPを用いずにC++で書くとadd2()関数呼び出しの中身は「vtable参照」+「add1()関数呼び出し」+「add 1」を2回することになる
2023/03/29(水) 08:27:05.33ID:hbkToQM4
>>693
パフォーマンスを測るまでもなく、吐かれるバイナリの汚さ
書いた一言一句が何になるか、気になって仕方ないのがC++erだよ(諸派あり、用途にもよる
バイナリエディタに放り込んだらわかるまである
2023/03/29(水) 08:41:42.91ID:jqKX3lj0
>>694
おっ、そうだな
https://godbolt.org/z/M71z9cx74
2023/03/29(水) 09:39:43.93ID:gptXJHJd
この英語版wikipediaのC++サンプルコードとコンパイル結果が詳しい
https://en.wikipedia.org/wiki/Virtual_method_table#Example
CRTPを使わないとvirtual method tableが出てきて不利になる
698デフォルトの名無しさん
垢版 |
2023/03/29(水) 10:58:30.49ID:DCEr0ZuV
CRTPが嫌ならテンプレート分ければいいだけでは?
2023/03/29(水) 11:49:15.76ID:KmrCY6Bh
>>678
これってダウンキャスト入ってるから危険なこともできそう
相当するコードはRustではコンパイル通らない?
#include <iostream>
#define DOUT(arg) std::cout << #arg": " << arg << std::endl
template<typename T> struct AddN {
void add2() {
static_cast<T*>(this)->add1();
static_cast<T*>(this)->add1();
}
};
struct Foo : AddN<Foo> {
int x;
Foo(int i) : x(i) {}
void add1() {
this->x++;
}
};
struct Bar : AddN<Foo> {
double y;
Bar(double i) : y(i) {}
void add1() {
this->y+=0.1;
}
};
int main () {
Foo foo (1); Bar bar (0.1);
DOUT (foo.x); DOUT (bar.y);
foo.add1 (); bar.add1 ();
DOUT (foo.x); DOUT (bar.y);
return 0;
}
2023/03/29(水) 11:51:44.76ID:KmrCY6Bh
実行したら以下のようになった
$ ./a.out
foo.x: 1
bar.y: 0.1
foo.x: 2
bar.y: 0.2
最後のbar.yは1.1になると思ってたんだがはて?
2023/03/29(水) 12:42:03.29ID:KmrCY6Bh
そもそもBarはFooを継承してないんだから
ダウンキャストのところでコンパイルエラー出て良いようなもんだけど
何で通すんだろ? templateだとチェックを緩和してるのかな?
あるいはコンパイラのバグかな?
$ g++ --version
g++ (Debian 10.2.1-6) 10.2.1 20210110
2023/03/29(水) 12:43:14.11ID:KmrCY6Bh
-ダウンキャストのところでコンパイルエラー出て良いようなもんだけど
+static_cast<T*>(this)->add1();のところでコンパイルエラー出て良いようなもんだけど
2023/03/29(水) 12:55:36.31ID:jlgG+N1i
最近のC++はよく分からんけどその例だとadd2使わないと多分変なことにならない
doubleをint扱いして1足しても1/(2^53)(←不正確、指数部による)くらいしか変動しないのかな
FooもBarもAddN継承してるからstatic_castでコンパイルエラーは出ないはず

Rustはクラス継承がないからstatic_castとの正確な比較はできない
traitで似たようなコード書くときはSelfキーワードで自分の型を指すからダウンキャスト必要ないし
敢えてstatic_castと対応させるならtransmuteだろうけどunsafe付きの関数だから危険でもコンパイルは通せる
(unsafeを使う範囲の安全性保証はプログラマの責任)
2023/03/29(水) 13:10:19.46ID:KmrCY6Bh
>>703
>最近のC++はよく分からんけどその例だとadd2使わないと多分変なことにならない
あーごめんごめん!興味があったのはadd2を呼んだときの挙動だった
- foo.add1 (); bar.add1 ();
+ foo.add2 (); bar.add2 ();
$ ./test
foo.x: 1
bar.y: 0.1
foo.x: 3
bar.y: 0.1 <- 鼻から悪魔

>FooもBarもAddN継承してるからstatic_castでコンパイルエラーは出ないはず
なるほどキャストしているthisはAddN<Foo>*だから
Foo*にもBar*にもダウンキャストできるってことね
ありがとう
2023/03/29(水) 13:47:10.36ID:KmrCY6Bh
正当?なC++的にはdynamic_castすべきなんじゃなかろうかって思うんだよね
でそれはvtable介してadd1にアクセスするのと変わらない
プログラマの責任でstatic_castして効率化する
ってテクニックは俺は割と好きだけども
2023/03/29(水) 14:18:14.91ID:JN59fMMe
>>703
transmuteはダウンキャストではなく任意の型同士の強引な型変換(読み替え)だから当然unsafe
一方でダウンキャストは親から子、基底から派生、抽象から具体への変換を指す
Rustの場合は抽象的なトレイトから具体的な型への変換がダウンキャストとなる

Rustは基本的には静的ポリモーフィズムで
コンパイル時点で各具体的な型のコードへ安全に置き換わるモノモーフィズムなので
C++のstatic_castのような危険のあるダウンキャストを必要としないが正解

Rustでもdyn Traitを用いた場合のみ動的ポリモーフィズムとなり
C++のdynamic_castと同様に実行時ダウンキャストがdowncast()/downcast_ref()/downcast_mut()で可能だが
C++とは異なりRustはNull安全でダウンキャストできる
2023/03/29(水) 14:59:38.14ID:hbkToQM4
そこは、わずかにコストを支払って、reinterpret_castでもいいとは思うけどね
2023/03/29(水) 15:00:17.60ID:hbkToQM4
ああちがう、reinterpret_castを避ける、だ
2023/03/29(水) 15:30:35.32ID:jlgG+N1i
動的検査のコストよりもキャストに失敗した時の分岐処理のせいで最適化が阻害されるのを問題視してる感じ
かといって分岐しないなら動的検査の意味ないし
710デフォルトの名無しさん
垢版 |
2023/03/29(水) 15:35:36.31ID:jd4hHaC+
>>706
ダウンキャストの根本的な問題点を理解してないね
静的か動的かUBかどうかは副次的な問題点に過ぎない
2023/03/29(水) 15:40:07.88ID:R/bWJVR7
Rustのポインタ(参照)のNull安全ってすごく上手い仕組みだな
C++のdynamic_castもRustのdowncast_refも生成コードはどちらもダウンキャスト成功時はそのままポインタを返して失敗時は0を返す点で効率も同じだけど
Rustでは返す型としてはそれをポインタで直接に表さずにOption<&T>を返すと表現させて
成功時はOption::Some(&T)を返して失敗時の0はOption::Noneとして返すため
プログラムコード上はNoneかSomeか生成コードでは0か否かをチェックせずには使えないわけだ

C++でのNullポインタか否かのチェック忘れを静的な型チェックで防止できるってことは
もしかしてC++でもdynamic_castやその他のNullポインタを返すライブラリ全てをstd::optionalを返すように変更すればNull安全になるんじゃないか?
2023/03/29(水) 15:45:49.19ID:RttupHdJ
>>710はいつものデタラメ言いがかり君に似てる
闇雲に否定して別の問題点があると主張しつつ
その問題点を述べることは一切ないので書き込みの中身がない
713デフォルトの名無しさん
垢版 |
2023/03/29(水) 17:50:54.05ID:aWl/4JyA
>>711
デフォルトmoveの導入は無理だと思ってるくせにNull安全は導入できると思ってるのかw
オツム弱っww
2023/03/29(水) 18:18:44.67ID:eKurmGUm
たぶん人違いじゃないかな?
dynamic_castの返り値を確認しないやつは
流石におらんと思うよ
静的に確認してくれても全く嬉しくない
2023/03/29(水) 18:19:38.85ID:eKurmGUm
訂正
静的に確認を強制されても嬉しくない
2023/03/29(水) 18:50:51.61ID:3DtieHtv
ヌルポインタが返る全ての関数についてそうしないとヌル安全にならない
ヌルを使ってはダメ
2023/03/29(水) 19:05:30.65ID:KmrCY6Bh
それは当然だよ
C++では指し示した先にインスタンスがあるかどうか
分からんときにのみポインタを使う
確実にあるときは参照を使うのが流儀
ポインタが使われるところではnullptrのチェックを行う
この流儀の部分を守らないスカタンが問題なんだな
Cに参照がないので上記流儀が守られないことも問題
2023/03/29(水) 19:30:08.82ID:ap6Xt56V
>>704
なぜそのC++のプログラムは正しく動かいていないの?
bar.yはadd2()で0.2足されて0.1から0.3にならないといけないのに0.1のままになってる
>>699のソースコードを見ても正しく動かない原因がよくわからない
2023/03/29(水) 19:36:28.24ID:KmrCY6Bh
>>718
BarはAddN<Bar>ではなくAddN<Foo>を継承しているから
2023/03/29(水) 19:41:07.31ID:ap6Xt56V
>>719
add2()としてBarの+0.2が使われずFooの+2か使われるということ?
bar.yが2.1になっていないのはなぜ?
2023/03/29(水) 19:53:07.69ID:KmrCY6Bh
templateを展開すると
void Add <Foo>::add2() {
static_cast<Foo*>(this)->add1();
static_cast<Foo*>(this)->add1();
}
thisはBarの基底AddN<Foo>*のポインタ
これをBarと無関係のFoo*にキャストしたら動作は不定
2023/03/29(水) 20:09:37.10ID:ap6Xt56V
なるほど
浮動小数点に対してそれを整数と見て+2してしまっているのかな
本来はコンパイル段階でエラーにしないとやばそうだ
今回はっきり動いていないとわかるケースだからいいけど何となく動いてしまってるケースがあると恐ろしい
2023/03/29(水) 20:11:29.28ID:KmrCY6Bh
正当?なC++的にはdynamic_castすべきだと思うんだよね
template<typename T> struct AddN {
void add2() {
dynamic_cast<T&>(*this).add1();
dynamic_cast<T&>(*this).add1();
}
virtual ~AddN () {};
};
2023/03/29(水) 20:13:55.05ID:AtW1ukjc
静的に一意に決まるんならいいのでは
2023/03/29(水) 20:29:34.23ID:KmrCY6Bh
俺は割と好きだけどもね
2023/03/29(水) 20:42:15.15ID:rGt9yURA
C++最適化効きすぎてadd2そのものが展開されて最短コードにしかならん
2023/03/29(水) 20:50:49.78ID:ij9aGzzi
doubleのビット列をintとして扱ってインクリメントしてるから結果がおかしいんだろ
なぜコンパイラは型不一致エラーを出せないんだ?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況