X



C++相談室 part150
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2020/03/24(火) 00:04:33.93ID:YFRNwZnv
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part149
https://mevius.5ch.net/test/read.cgi/tech/1581974381/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/


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

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

テンプレここまで
0127デフォルトの名無しさん
垢版 |
2020/04/02(木) 15:26:39.69ID:Qj/v/C6S
あー調べたら意味わかったわ、結果を格納する左辺が非constexprなら定数式としては呼ばれないと決まってるんだな
それを定数式の文脈と呼ぶのはおかしいと思うが
0128はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/04/02(木) 15:30:04.54ID:sLIn31jD
>>127
cpprefjp でそういう用語を使ってるから私もそれに倣ったんだけども、
cppreference の方では「定数式を要求する文脈」という言い方をしてるなぁ。
こっちの方がわかりやすいと思うので今後はこっちを使うようにするよ。
0130デフォルトの名無しさん
垢版 |
2020/04/02(木) 17:00:14.72ID:0tSRYO67
使い道を想像できない人のほうが多いことにとても驚いてます。
0131デフォルトの名無しさん
垢版 |
2020/04/02(木) 17:05:14.94ID:0tSRYO67
Javaは心が洗われるような美しい言語だったのに、豆とか言い出したあたりから汚れてしまった。
もはや何も感じない。
0133デフォルトの名無しさん
垢版 |
2020/04/02(木) 17:05:53.37ID:0tSRYO67
>>132
Excel使わなくて済むなって。
0134デフォルトの名無しさん
垢版 |
2020/04/02(木) 17:08:51.09ID:0tSRYO67
https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inhtml
今ここやってんの。
色々検索してたら、std::sortにconstexprが付くというのを見つけて。
なんだこれ!
なんだこれ!
なんだこれ!
となった。
でもまだついてないから使えない。
0136デフォルトの名無しさん
垢版 |
2020/04/02(木) 17:19:53.12ID:RbNpa6BP
翻訳時に解決できることを、実行環境に持ち越さないために
コンパイラ方式であることが20年かかってもわからんやつが
constexprという止めまで刺されてまだ暴れてるな
0138デフォルトの名無しさん
垢版 |
2020/04/02(木) 17:48:06.37ID:0tSRYO67
大 変 驚 い て い ま す !
0140デフォルトの名無しさん
垢版 |
2020/04/02(木) 18:05:19.51ID:Qj/v/C6S
>>136
うん、だから実例よろしく
所詮、TMPでやってたことを実行時コンパイル時普通の関数の形で書けるなら便利ってだけの話だよね
constexprの利点がそれ以上であるというなら実例出せ
0141デフォルトの名無しさん
垢版 |
2020/04/02(木) 18:12:59.71ID:0tSRYO67
発想を逆にしてみたらどうだろ。
100万件のデータをソートしたらコンパイル時間が増えるみたいな方向性じゃなくて。
100万件のデータにマッチさせる側の数十件の情報をコンパイル時にソートするとしたら?
ぐもももも!ってなる。

ちなみに100万件の文字列をソートするのは数百ミリ秒。
そんなに怖がるほどでもない。
0142デフォルトの名無しさん
垢版 |
2020/04/02(木) 18:13:43.47ID:RbNpa6BP
>>140
コンパイラ方式という壮大な実例を出しているんだが
20年かかってもわからんやつには無理のようだな
0144デフォルトの名無しさん
垢版 |
2020/04/02(木) 18:23:36.92ID:0tSRYO67
こ れ は 凄 い こ と で す よ !
0145デフォルトの名無しさん
垢版 |
2020/04/02(木) 18:26:27.69ID:0tSRYO67
21世紀最大の発明と言われる右辺値参照についてもコメントお願いします。
ノーベル賞はいつ決まるんでしょうか。
0146デフォルトの名無しさん
垢版 |
2020/04/02(木) 18:28:13.54ID:jVaX7Z/j
まあPL/1は35年前からプリプロセッサでサブルーチンも定義できてたから今更コンパイル時にソートできてもたいした驚きはないわ
0147デフォルトの名無しさん
垢版 |
2020/04/02(木) 18:35:18.32ID:4Juv79OL
西洋人の決定論が反映されている
「未来は決まって無い」という考え方はダイナミックであり動的と呼ばれる

「未来は全て決まっている」というのが彼らの古典的な思考方法
未来において起こることの全ては、あらかじめ既に決まっている
というか、神が決めた

そういう宗教的思想あるいは神学が反映されている
0148デフォルトの名無しさん
垢版 |
2020/04/02(木) 18:42:26.03ID:0tSRYO67
禿 げ に ノ ー ベ ル 賞 を !
0149デフォルトの名無しさん
垢版 |
2020/04/02(木) 18:51:05.61ID:0tSRYO67
>>147
ドラゴンブックを一通り実装したかどうかで変わるだけでは。
0152デフォルトの名無しさん
垢版 |
2020/04/02(木) 21:57:48.18ID:RbNpa6BP
>>147
自分が書いたコードの中までコペンハーゲン解釈なんだろ
量子コンピュータでもないTTL〜CMOSの回路で
0156デフォルトの名無しさん
垢版 |
2020/04/05(日) 06:22:54.73ID:g2vNnymJ
デマングルのことで質問があります。Ubuntu上でwebkitgtkというライブラリを見てるんですが、ライブラリ内に
以下のような2つのシンボル

_ZN3WTF6StringC1EPKDsj
_ZN3WTF6StringC2EPKDsj

があるんですが、これらはデマングル後

WTF::String::String(char16_t const*, unsigned int)
WTF::String::String(char16_t const*, unsigned int)

となって区別がつかない(少なくとも自分には)んですが、これはどういうことでしょう。C1とC2という部分の違いは...
ちなみに元のコード上では同じ型のコンストラクタがダブってたりはしていません(と思います)。し、ダブってたら
コンパイル時にエラーになりますよね?
リンカー的にはデマングル前のシンボルで扱うんでしょうから両者とも必要なんでしょうねやはり
0157デフォルトの名無しさん
垢版 |
2020/04/05(日) 08:18:36.63ID:QAcrCW73
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;
}
0161デフォルトの名無しさん
垢版 |
2020/04/05(日) 14:41:32.21ID:P07lI1PF
UChar * と char16_t * の方だから 84-86 行目の方だったスマソ
0162デフォルトの名無しさん
垢版 |
2020/04/05(日) 17:57:58.00ID:IgCOpQa5
>>160
おっとすみません、単なるその説明の訳かもしれませんが、
内部的には (1)基底クラスを直接使う時のコンストラクタ (2)基底クラスから継承したクラスを
使う時に基底クラスを初期化するコンストラクタ と二つある、
けどデマングルした名前では両者の区別はつかなくなる(だけ)、みたいな感じでいいんですかね?

>>159 >>161
うーんと意味がよくわからないです。あと、特定のコードには寄らない話っぽいですね。
0163デフォルトの名無しさん
垢版 |
2020/04/06(月) 00:17:22.43ID:YN01J8oK
2次元のレイキャスティングを作成しようとしてます。

ttps://github.com/OneLoneCoder/olcPixelGameEngine/blob/master/Videos/OneLoneCoder_PGE_ShadowCasting2D.cpp
にあるコードを現在javaで書いており、

ttps://youtu.be/fc3nnG2CG8U?t=1519
のように縦に長く1本線が出来てほしいのですが、
縦やにブロックを並べた時に、なぜか1ブロックごとに線が出来てしまいます。

どうすれば動画みたいに、縦に長い1本線が出来ますでしょうか?
コードは
ttps://ideone.com/spxzNE
に載せてみました。
0164デフォルトの名無しさん
垢版 |
2020/04/06(月) 00:42:09.55ID:JpxE2ikJ
Javaの質問ならJavaスレへ逝け
0166デフォルトの名無しさん
垢版 |
2020/04/06(月) 20:20:19.81ID:umYPTPrb
わかりました。javaの法で聞きます。
0168デフォルトの名無しさん
垢版 |
2020/04/08(水) 01:04:01.57ID:sLx4/ZJO
質問ですが抽象メソッドを有するクラスのデストラクタは
なんで勝手に仮想デストラクタにならないんでしょうか…
なんか有用なイディオムでもあるんでしょうか……………

C#しばらくやった後だったのでC#のつもりでインターフェースを定義して
virtual ~IFoo() { }
を書き忘れた結果盛大にリークすたgrz
0169はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/04/08(水) 09:41:04.41ID:kI16h2GK
>>168
ゼロオーバーヘッドの原則は C++ 的にはかなり強い要請なので……。
オブジェクトに常にポインタを保持しなければならないことと、
呼び出すときに仮想関数テーブルをたどるコストがあるってのは看過できなかったんだろう。
0170デフォルトの名無しさん
垢版 |
2020/04/08(水) 09:52:16.86ID:BKxeQF3m
ん〜そもそも抽象と仮想はもともとの発想が違うから似て非なるもの
さらにC#においてclassとinterfaceは似て非なるもの
C++に厳密な意味でinterfaceを実現する機能はない
そのへんはよしなによしなに

ていうか~IFOOの書き忘れがリークの元凶て発想があかん
解放し忘れしたらあかん物はsafe〜とかのクラスに押し込むべき
0171デフォルトの名無しさん
垢版 |
2020/04/08(水) 10:09:18.67ID:bRUXA7Cg
でも仮想関数を持つクラスのデストラクタをわざわざ非仮想にするメリットってなんかあるの?実際の所
0173デフォルトの名無しさん
垢版 |
2020/04/08(水) 11:24:20.39ID:BKxeQF3m
>>171
インターフェースという位置づけなら仮想・非仮想どちらにしろデストラクタが直に呼ばれるべきじゃないんじゃないかと思うわ
ただのインターフェースだからむしろ非仮想&protectedで隠すのがいいんじゃないかと(しらんけど)

↓こんなイメージで直にデストラクタ触れるのはclass A以降
struct IFOO
{
protected:~IFOO();
};
class A:IFOO
{
public: virtual ~A();
};
class B:A{};
class C:A{};
0174デフォルトの名無しさん
垢版 |
2020/04/08(水) 11:40:23.05ID:bRUXA7Cg
それって要するに解放する時に、IFOOじゃなくてAだとかBだとかの
インスタンスの正体を全て把握しとけってことでしょ?
だったらそもそもIFOOって必要なの?って思う
0175デフォルトの名無しさん
垢版 |
2020/04/08(水) 11:48:39.21ID:cOYSaP/H
>>171
俺の狭い知見ではまず無いと思うよ
ただvirtual付けてないのに勝手に仮想になると言うのもいかがなものかと思う
0176デフォルトの名無しさん
垢版 |
2020/04/08(水) 12:03:48.95ID:cOYSaP/H
途中で書き込んでしまった

なので、やるとしても警告を出すぐらいだな
って思ってたらVisual Studio 2017だと既に警告出るわ(「警告をすべて有効にする」にしないとダメだけど)

warning C4265: 'C': クラスは仮想関数を含んでいますが、デストラクタはこのクラスの仮想インスタンスではなく、正しく消滅されない可能性があります
0177デフォルトの名無しさん
垢版 |
2020/04/08(水) 12:54:49.68ID:BKxeQF3m
>>174
まあ不要かもしらんけどねぇ
でもC#でも仮想デストラクタを入れてるインターフェースてなくね?
リソース開放を請け負うIDisposableにしても派生クラスのデストラクタから呼び出す形
呼び出さなきゃ勝手に呼ばれるわけでもない
むしろ仮想デストラクタは便利だから使う程度の利点しかなくてインターフェースとしては不要なんじゃないかと言う気がする
0179デフォルトの名無しさん
垢版 |
2020/04/08(水) 13:27:08.18ID:lWfV0IAd
GCに夢観過ぎ
0180デフォルトの名無しさん
垢版 |
2020/04/08(水) 13:32:26.06ID:bRUXA7Cg
夢の話じゃなくてリソース解放戦略が全然違うんだから比べても仕方ないだろ
というかそもそもC#は全部のメソッドがC++で言うところのvirtualなんだから比べようもない
0181デフォルトの名無しさん
垢版 |
2020/04/08(水) 14:40:59.29ID:lr7ClYRx
学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net

数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

PS スカイプ友達の掲示板 ttp://skype.x0000.net
0183デフォルトの名無しさん
垢版 |
2020/04/08(水) 22:17:53.89ID:sLx4/ZJO
class IFoo {
  virtual int sum(int a, int b) const = 0;
};

これの書き方でリーク原因だったという話、
0185デフォルトの名無しさん
垢版 |
2020/04/08(水) 22:23:35.70ID:sLx4/ZJO
public: を忘れたgrz、

で、
class IFoo {
public:
  virtual ~IFoo() { }
  virtual int sum(int a, int b) const = 0;
};
としたら治まった、
0186デフォルトの名無しさん
垢版 |
2020/04/08(水) 22:26:09.85ID:sLx4/ZJO
>>172
std::shared_ptr<(IFooの派生クラス)> pObj(new (IFooの派生クラス)()) ならそもそもsumの方こそ仮想関数でなくても良い
std::shared_ptr<IFoo> pObj(new (IFooの派生クラス()) ならデストラクタが仮想でないとマズー

仮想関数有りかつ非仮想デストラクタ、を許すC++のこの仕様の理由をゼロオーバーヘッドの原則で説明くのであれば
仮想関数有りかつ非仮想デストラクタ、を許すことで得られる性能上のメリットが指摘されねばならない
0187デフォルトの名無しさん
垢版 |
2020/04/08(水) 22:35:26.36ID:iAMh5USc
てかそれshared_ptrの作り方が悪いだけじゃん
普通make_sharedで作る。
weakを使う場合でオブジェクト自身が巨大なためメモリは即座に解放したいときでも一度newした型のshared_ptr作れと
0189デフォルトの名無しさん
垢版 |
2020/04/08(水) 22:38:08.35ID:iAMh5USc
大体純粋仮想しか持たないクラスって要はinterfaceでしょ

そのポインタで派生オブジェクトのインスタンスのリソース管理するってのとは全く別の概念じゃないか
0191デフォルトの名無しさん
垢版 |
2020/04/08(水) 22:51:06.86ID:iAMh5USc
>>186
あー何となくわかったわ
shared_ptrの使い方分かってないのね
一度派生型のshared_ptrで作ったら、それをbaseのshared_ptrに代入して保持していても、デストラクタは元の型で呼ばれるよ

ってかそういう風に使うもの
newと入れるshared_ptrの型を変えるのはダメな使い方
0192デフォルトの名無しさん
垢版 |
2020/04/08(水) 22:56:00.22ID:iAMh5USc
って思ったけどよく考えたらいきなりbaseのshared_ptrに入れても大丈夫だったはず
0195デフォルトの名無しさん
垢版 |
2020/04/08(水) 23:44:04.80ID:oQNNxwBC
>一度派生型のshared_ptrで作ったら、それをbaseのshared_ptrに代入して保持していても、デストラクタは元の型で呼ばれるよ
えっそうなん?って試してみたらマジだった。
https://ideone.com/ZRde8G

https://cpprefjp.github.io/reference/memory/shared_ptr.html
> 通常、void*に型変換して代入されたポインタは、delete演算子を呼んだとしても元の型のデストラクタは呼び出されない。しかしshared_ptrの場合は、代入されたポインタの型が持つデストラクタが正しく実行されることが保証される。

知らんかった。
0196デフォルトの名無しさん
垢版 |
2020/04/08(水) 23:57:12.53ID:bRUXA7Cg
万能じゃないけどな
作る時に本来の型を教えないといけない

shared_ptr<Base> s(new Derived()) // OK

Base* b = new Derived();
shared_ptr<Base> s(b); // NG
0197デフォルトの名無しさん
垢版 |
2020/04/09(木) 00:30:09.12ID:U7264wso
> 作る時に本来の型を教えないといけない

なるほど。
ttps://ideone.com/BUt4xc

教えてくれてありがとうな。勉強になる。
0200デフォルトの名無しさん
垢版 |
2020/04/09(木) 02:46:58.11ID:xoGUUmQY
横レスですみませんがそもそもポインタなんてCの配列かscanfくらいでしか使ったことないんですがスマポとかってどんな事(時)に使うんですか?
0201デフォルトの名無しさん
垢版 |
2020/04/09(木) 03:49:37.37ID:Jilblwzi
スマートポインタどころか、new deleteさえ使わなくなったな。
0203デフォルトの名無しさん
垢版 |
2020/04/09(木) 07:41:56.66ID:Jilblwzi
昔はよくやりましたよね。
0205デフォルトの名無しさん
垢版 |
2020/04/09(木) 08:55:49.91ID:LQ7/CkSE
C++は昔からそうだったと思うが
まぁCだと関数が確保して呼び出し元でどうこうするのも多かったけど
0210デフォルトの名無しさん
垢版 |
2020/04/09(木) 18:20:12.74ID:uChXMS9h
>>200
CreateWindowExのlParam経由でオブジェクトのポインタを渡して受けて側でunique_ptrに格納して管理したりしてるよ
0212デフォルトの名無しさん
垢版 |
2020/04/09(木) 19:11:41.90ID:jjLWwUCO
>>211
だからあんまり使わんようにって感じなってるだろ。
使うとしてもスマポであるスコープ外れたら回収するように作るとか、
そういう方向をどの言語も推奨してる。
0216デフォルトの名無しさん
垢版 |
2020/04/09(木) 22:37:55.19ID:jjLWwUCO
python,go,rustあたり見てもスコープ抜けた時に後処理する機構をサポートしとる。
0217デフォルトの名無しさん
垢版 |
2020/04/09(木) 22:46:51.57ID:Yh5weH6+
お前はスコープで管理するのが主流っていったわけだけど
gcのないc++ではスコープで管理できるものはスコープで管理するのは
大昔から当たり前ではないでしょうか
何がいいたいのやらわからん
0218デフォルトの名無しさん
垢版 |
2020/04/09(木) 23:15:28.15ID:U1el1zKz
C++はおじょーずでも日本語アレな奴多いよね
職場でちゃんとコミュニケーションとれてるか?www
0222デフォルトの名無しさん
垢版 |
2020/04/10(金) 06:08:55.13ID:JXOjZTrq
プログラミングスタイルが変わってきてるんだよね。
アジャイルとOOPは相性が悪いのかもしれない。
■ このスレッドは過去ログ倉庫に格納されています

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