C++相談室 part142

■ このスレッドは過去ログ倉庫に格納されています
2019/04/01(月) 22:17:05.84ID:wmfpIKt/
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/
C++相談室 part140
https://mevius.5ch.net/test/read.cgi/tech/1547326582/
C++相談室 part141
https://mevius.5ch.net/test/read.cgi/tech/1550772463/

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

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

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

----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2019/04/19(金) 19:16:13.92ID:yj9Iz3m1
こんな事言うと勘違いされそうだが、はちみつ餃子はちゃんとしてると思うよ
C++に関しておかしなことは言っていない
ていうか、はちみつ餃子ってものすごい不味そうなんだがそんなの本当にあるのだろうか・・?
2019/04/19(金) 19:17:39.46ID:j263LUSd
肉料理にはちみつを入れること自体はわりと普通
量の問題
2019/04/19(金) 19:28:19.17ID:PWe5dNBv
いや明らかに開発してねーだろって感覚じゃねーか。
まあここならそれでもいいんだろうけれど。
2019/04/19(金) 19:51:37.44ID:mypEidUJ
>>338
ググればわかるけどはちみつ餃子はそこそこありふれた料理だよ。

その昔、 higepon が自分でもどうして higepon などと名乗ったかわからない
と述べていたので、そのくらい意味不明感じにしようと思って適当に
思いついた語をコテハンにした。
Scheme スレが本来の住処なので当初は SCHEME餃子 と名乗っていたけど、
他のスレにも顔を出すようになったのでなんとなくはちみつ餃子になった。
およそ意味不明な組合せにしたつもりだったんだけど、
実際にある料理だとは後になってから知った。
2019/04/19(金) 21:11:54.81ID:fEN/Hp+M
initializer_listを引数に取るオブジェクトを引数に取る関数で
下記のケースでUniversal Initializationが効かないのですが
何かいい手はないでしょうか

using KVPCollectionType = std::map<std::string, std::string>;
void f(const KVPCollectionType&& kvps = {});

f(); // OK
f({}); // OK
f(KVPCollectionType{{"key1", "value1"},{"key2","value2"}}); // OK

f({{"key1", "value1"},{"key2","value2"}}); // NG これをやりたい!!
2019/04/19(金) 21:13:17.21ID:UQpKfTQY
エピ…いや何でもない
2019/04/19(金) 21:17:05.52ID:fEN/Hp+M
すみません、訂正です
× void f(const KVPCollectionType&& kvps = {});
○ void f(const KVPCollectionType& kvps = {});
345デフォルトの名無しさん
垢版 |
2019/04/19(金) 21:22:53.30ID:/DYxLH/O
アークエンジェルに搭載されてるstd::variant<>。
2019/04/19(金) 22:49:42.25ID:DWxUZ3pl
wandboxで試したらclangでもgccでもc++11 -pedanticで通ったけど?
2019/04/20(土) 00:01:37.25ID:a7z6m7l4
ごめんなさい、ごめんなさい。本当にごめんなさい。
勝手に脳内で要約したのが間違えまくってました

正確には以下の通りです。
#include <map>
#include <memory>
using KVPCollectionType = std::map<std::string, std::string>;
class c {
public:
c(const KVPCollectionType&& kvps = {}){}
};
int main()
{
auto ok = std::make_shared<c>(KVPCollectionType{{"key1", "value1"},{"key2","value2"}}); // OK
auto ng = std::make_shared<c>({{"key1", "value1"},{"key2","value2"}}); // NG!!!
}
348デフォルトの名無しさん
垢版 |
2019/04/20(土) 10:47:21.77ID:5oa1AZjP
全てのバグを絶滅せよ。
「今日は死に日和」好評発売中。
2019/04/20(土) 11:08:43.59ID:3kBWifqd
C++11や14を使ってる人、コンパイラは何ですか。
2019/04/20(土) 11:25:30.96ID:m+a2EYsq
ゲームエンジン作ってる人いますか
351デフォルトの名無しさん
垢版 |
2019/04/20(土) 11:30:38.02ID:5oa1AZjP
clとgcc。
2019/04/20(土) 13:20:15.93ID:lwVpLCzw
c+11以降はバージョン違うと全く別のコンパイラ
2019/04/20(土) 13:23:19.12ID:8Vh3F1FF
Twitchでプログラミングしてるやつの中でゲームエンジンも居たような
2019/04/20(土) 13:30:02.11ID:7hm/FBJ7
>>347
テンプレートの推論ルールとして「関数テンプレートのパラメータとして波カッコの初期化子リストを渡して型推論させることはできない。」
ということになっている。 ( https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html )
make_shared の実際の型は template <class T, class... Args> shared_ptr<T> make_shared(Args&&... args); なので、
このとき Args が推論できない以上はどうにもならん。
型を固定した専用の関数をはさんでこんな感じにするくらいのことしか思いつかないな。

#include <map>
#include <memory>
#include <initializer_list>
#include <utility>

using KVPCollectionType = std::map<std::string, std::string>;
class c {
public:
c(const KVPCollectionType&& kvps = {}){}
c(const std::initializer_list<typename KVPCollectionType::value_type>){}
};

std::shared_ptr<c> make_c_shared(std::initializer_list<typename KVPCollectionType::value_type> a) {
return std::make_shared<c>(std::move(a));
}

std::shared_ptr<c> make_c_shared(KVPCollectionType&& a) {
return std::make_shared<c>(std::move(a));
}

int main() {
auto ok = make_c_shared(KVPCollectionType{{"key1", "value1"},{"key2","value2"}});
auto ng = make_c_shared({{"key1", "value1"},{"key2","value2"}});
}
2019/04/20(土) 13:32:51.70ID:7hm/FBJ7
>>347 >>354
呼出す側で

auto ng = std::make_shared<c, std::initializer_list<typename KVPCollectionType::value_type>>({{"key1", "value1"},{"key2","value2"}});

というように型を明記してもかまわないけど、使う側でいちいちこんなこと書きたいわけじゃないだろ?
2019/04/20(土) 13:35:42.76ID:7hm/FBJ7
>>347
ちゃんと考えたら >>354 はいらんことしとるな……
これで充分か

#include <map>
#include <memory>
#include <utility>

using KVPCollectionType = std::map<std::string, std::string>;
class c {
public:
c(const KVPCollectionType&& kvps = {}){}
};

std::shared_ptr<c> make_c_shared(KVPCollectionType&& a) {
return std::make_shared<c>(std::move(a));
}

int main() {
auto ok = make_c_shared(KVPCollectionType{{"key1", "value1"},{"key2","value2"}});
auto ng = make_c_shared({{"key1", "value1"},{"key2","value2"}});
}
2019/04/21(日) 08:19:35.76ID:jJhiZdMc
>>354-356
ありがとうございます、その手を使わせていただきます
状況によって推定ルールが変わるのはやめて欲しいなってちょっと思ったんですけど。
2019/04/22(月) 23:55:58.01ID:uyfay/gq
メンバアクセスにthis->つける?
2019/04/23(火) 00:01:58.24ID:cW1os5L0
エディタの補完機能使いたいときにたまにそうやって補完して最後に消す。
が、たまに忘れる。
2019/04/23(火) 00:02:35.52ID:BSgCsXpz
IDEの都合で付ける事が良くある
付けないと補完候補多すぎて
2019/04/23(火) 00:09:08.10ID:JKfCESEZ
ああなるほど
補完候補を絞るのには便利ですね
362デフォルトの名無しさん
垢版 |
2019/04/23(火) 18:16:01.64ID:Wx+D+gzo
メンバであるという保証ができるので付ける
2019/04/23(火) 19:39:28.32ID:cE0Yu4R7
メンバ名は頭にm_付けろみたいなクソルールよりずっといいと思うので付けるべき
2019/04/23(火) 19:42:38.83ID:JKfCESEZ
仮引数と別の名前つけるのだるいからm_は別に良いと思う
2019/04/23(火) 20:02:01.86ID:8XemHsTC
メンバ変数に専用の色付けたらいいじゃん
2019/04/23(火) 20:13:43.06ID:sktjqElV
引数そのままメンバに入れるなら引数に_つけてvar(_var)って初期化してるわ
2019/04/23(火) 20:16:13.74ID:JSYnwir1
>>366
それって var(var) でも問題ないんですよ…
2019/04/23(火) 21:18:06.78ID:DAl4rXky
バーバー
2019/04/23(火) 21:32:08.36ID:BSgCsXpz
>>367
綴り間違えたら悲惨なことになった
370デフォルトの名無しさん
垢版 |
2019/04/23(火) 21:34:08.78ID:3k1+3l7a
ハンガリアン記法は、入力補完のないエディタ上での可読性を高めるのに役立ってるでしょ。今でも。
2019/04/23(火) 21:35:06.30ID:8XemHsTC
ゴミ使ってる奴のことなんか知らん
2019/04/23(火) 21:36:10.37ID:BSgCsXpz
あれ可読性落ちるだろ
2019/04/23(火) 21:39:11.30ID:lLaZpSEH
定期的にunsignedとsigned混在させてハマるアホをみるとハンガリアン必要だと思うわ
2019/04/23(火) 21:40:37.34ID:lAbUfbw7
C#で入力補完のないエディタがどうとかさすがにナンセンスでは
だってvisual studio使うじゃん
2019/04/23(火) 21:41:16.53ID:ZkNEZW45
どっちでもいいわ。
大抵の場合そんなとこに気を使わんといかんコードになってることのが問題。
2019/04/23(火) 21:45:47.89ID:lLaZpSEH
>>375
こういうやつがそのうちハマって丸1日つぶしたりするんだよなw
2019/04/23(火) 21:51:11.17ID:8XemHsTC
>>373
関係なくて草
2019/04/23(火) 21:55:03.06ID:lLaZpSEH
関係あることわかってなくて草
2019/04/23(火) 21:55:54.04ID:8XemHsTC
黙ってろゴミw
2019/04/23(火) 21:59:25.62ID:ZkNEZW45
>>376
だから人を嵌めるようなコード書くなつってんだよばか。
2019/04/23(火) 22:06:36.15ID:lLaZpSEH
>>380
コードの問題じゃなくて言語仕様の問題だから
こういうえらそうなくせに何もわかってないカスが一番始末に困る
2019/04/23(火) 22:53:19.60ID:ZkNEZW45
いつの間にかハンガリアンが言語仕様になってた。。
2019/04/23(火) 23:10:13.77ID:lLaZpSEH
ハンガリアンも防御的なプログラミングと考えたら悪くないよ
成り立ち調べてみな
でも基本型とポインタだけだな
クラスには無用だと思う
2019/04/23(火) 23:27:23.37ID:8XemHsTC
てめーらはまともなIDEかエディタ使ってねえのかよ
2019/04/23(火) 23:37:57.35ID:JKfCESEZ
むしろVSがないと何も書けない
386デフォルトの名無しさん
垢版 |
2019/04/23(火) 23:55:15.96ID:UPBQPhwq
VSがあっても何も書けない。
2019/04/23(火) 23:55:30.60ID:ZkNEZW45
c++みたいに型情報ありがデフォルトの言語でハンガリアンとか二重メンテもいいとこだわ。
2019/04/24(水) 01:00:02.97ID:pnt3hUol
前方宣言したクラスをTにしたスマポメンバでコンパイル通るときと通らないときがあって調べてたら
デストラクタがインライン(暗黙)だと駄目だとわかった
しかもこの問題が起こるのはunique_ptrのときだけでshared_ptrはデストラクタの定義に関係なく通る
わけわからんぞ
教科書に書いておいてくれ

class ClassB;
class ClassA{
public:
ClassA();
private:
std::unique_ptr<ClassB> u; // NG
std::shared_ptr<ClassB> s; // OK
}

---

class ClassB;
class ClassA{
public:
ClassA();
~ClassA(); ←これでunique_ptrもOK
private:
std::unique_ptr<ClassB> u; // OK
std::shared_ptr<ClassB> s; // OK
}
2019/04/24(水) 07:38:59.52ID:IdP8M60W
>>388
unique_ptr<T>のデストラクタはインスタンス化するときにTが完全型であることを要求する(デストラクタで直接Tのデストラクタを呼ぶ)
unique_ptrを内包するクラスのデストラクタが暗黙だとクラス内でコンパイラによって実装されるけど、その場でunique_ptrのデストラクタを要求する
しかし、その翻訳単位内でTの定義が無ければコンパイルエラーとなる

unique_ptr<T>を内包するクラスのデストラクタがとりあえず宣言だけでもあると
実際の定義がある場所で同様の事が起こるので、その場所でTの定義が見つかればいい
その場合に定義を書かないと、コンパイラさんが適切な翻訳単位内に定義をおいてくれるみたい

shared_ptrは動的削除子のおかげでデストラクタが呼ばれるところで適切にデリータを定義し、デストラクタを呼ぶようになっているのでこの様な問題は起こらない
shared_ptr<T>のデストラクタ内ではTのデストラクタを直接呼び出すようなコードが無い
2019/04/24(水) 18:54:26.06ID:pnt3hUol
>>389
解説ありがとう
2019/04/26(金) 01:05:34.79ID:UW94aXeh
うーんC++プライマー8500円かぁ。本家のプログラミング言語C++第4版はもっとするし
情報量からすると安いが本一冊にポンと出すにはお高い……日本語である程度網羅的な本となるとこの2冊くらいよね
2019/04/26(金) 19:40:01.51ID:aJMYFNVy
set<double> って int のときと同様にちゃんとソートされるんですか?
2019/04/26(金) 20:34:04.97ID:Fns+A8Ou
NaNが無ければ大丈夫NaNじゃね
2019/04/26(金) 20:34:22.70ID:Fns+A8Ou
NaNが無ければ大丈夫NaNじゃね
2019/04/26(金) 22:17:06.30ID:PbDaLlJb
のちに永久保存される平成最後のスベり
2019/04/26(金) 23:59:20.16ID:LBUDtqYL
たしかにそうだな・・いよいよ平成最後なんだな
みなさん、>>393-394 みたいな事にならないよう、気をひきしめましょう
2019/04/27(土) 00:20:06.56ID:nrL5Mhiq
平成最後っていう言い回し使われすぎて嫌いになってきた
2019/04/27(土) 00:23:11.48ID:v7q7vgVx
イテレータの参照を次に移すときってなんでitr++ではなく++itrなの?
2019/04/27(土) 00:33:20.40ID:nrL5Mhiq
ヤフーでぐぐれ
2019/04/27(土) 01:04:24.73ID:oB7jkl++
素直な実装だとitr++より++itrのほうが速いんじゃないかなあ、となんとなくみんなが思っているから
2019/04/27(土) 01:07:57.61ID:v7q7vgVx
速度に差が出るのか
知らなかった
2019/04/27(土) 01:35:51.19ID:KjSesqKI
インクリメント後のイテレーターの値を返す処理の実装を考えると
先の場合はインクリメントしてそのまま渡せばいいけど
後の場合はインクリメント前の値を保存しといてそれを渡さないといけないので一手間かかるから
・・なんだけど諸々の最適化とか色んな条件とか考えたらそこまで差がでるかどうかはよくわからん
2019/04/27(土) 01:38:33.58ID:EJ6OYH9I
it++だと、戻り値をコピーしてとっておいてから、ポインタなりを進めた後にreturnする必要があるが、
++itだと、ポインタを進めた後に参照を返すだけでするからな。
2019/04/27(土) 01:39:08.58ID:EJ6OYH9I
被ったw
2019/04/27(土) 11:13:20.29ID:qp4sR6Ay
>>398
ite++と++iteなんて気持ちの問題
てか範囲for文使えばいい
406デフォルトの名無しさん
垢版 |
2019/04/27(土) 11:46:20.51ID:Tan1PMrG
>>402-405
cppcheck にかけたらちゃんと警告出るね。
2019/04/27(土) 14:06:33.77ID:dwPa57iA
どうせ戻り値捨てるんだったら++itを選んでおいて損はない
無駄にit++を使うのは時期尚早な最不適化って奴だ
2019/04/27(土) 19:31:57.61ID:Ht8C3PIL
C++で書くんだから後置インクリメントの方がメインに決まってんじゃん
前置は異端だ
2019/04/27(土) 19:37:22.12ID:nrL5Mhiq
殺せ
2019/04/27(土) 20:12:28.01ID:uerCNQ9f
++C
2019/04/27(土) 20:53:36.82ID:hHA0b+W+
C++でいいんだよ。
規格は一歩進むけど、使ってるやつはbetter Cばかりってな
2019/04/27(土) 20:55:05.03ID:nrL5Mhiq
++C++まだかよ
2019/04/27(土) 22:37:09.45ID:Czz6ceI0
>>411
vectorとかstringとか使わんの?
2019/04/28(日) 03:35:47.43ID:c2OY2Ben
CArrayとCStringだぞ
コピコンは定義されてないから自分で作るぞ
415デフォルトの名無しさん
垢版 |
2019/04/28(日) 11:01:20.49ID:DJV+PGkd
CArrayは、<algorithm>ヘッダーで定義された信頼性の高いユーティリティ関数を使えないのがね・・・。
2019/04/28(日) 13:46:52.13ID:nadmD8id
>>413
この思考がbetter C
2019/04/28(日) 14:25:38.47ID:n1RanWws
>>416
わけわからん
2019/04/28(日) 14:29:28.69ID:c2OY2Ben
俺がBest Cだ
2019/04/28(日) 14:56:12.05ID:mA4VukHK
>>415
イテレータをうまいこと定義すれば使えるやつも結構あるんじゃね?
そうでもない?
2019/04/28(日) 15:37:56.41ID:UbqPSgHc
inconsistent begin/end types in range-based ‘for’ statement

gcc(g++) 8.2で -std=c++17オプションでコンパイルで
範囲forでこのエラーが出るんだが
begin endの型不一致の制限緩和されいるはずだよな?
原因わかる方いますか?
2019/04/28(日) 15:49:39.60ID:4R543R/q
>>415
GetData()とGetData()+GetSize()を渡せば、とりあえず動くんじゃね?
2019/04/28(日) 16:05:30.47ID:n1RanWws
>>420 比較演算子定義されてないとか?
2019/04/28(日) 16:22:25.11ID:UbqPSgHc
>>422
int _n = 0;
auto __begin = _container.begin();
auto __end = _container.end();
for (; __begin != __end; ++__begin) {
_n = *__begin;
}
比較演算子はちゃんと定義してるし
上のコードは何故かコンパイル通る
だけど
for (const auto _n : _container) {
//hoge
}

は何故か通らない
2019/04/28(日) 16:41:14.97ID:n1RanWws
範囲for文のconst autoをconst auto&かauto&&に変えるとどうなる?
2019/04/28(日) 16:43:13.35ID:UbqPSgHc
>>424
auto&&にした時のみエラーが増えます
cannot bind rvalue reference of type ‘const long unsigned int&&’ to lvalue of type
2019/04/28(日) 16:54:13.46ID:/ZzCGjK1
beginとendのシグニチャは?
2019/04/28(日) 17:02:57.34ID:UbqPSgHc
>>426
using iterator = typename std;;vector<int>::iterator;
using const_iterator = typename std;;vector<int>::const_iterator;
using my_iterator = MYIterator;
my_iterator begin();
iterator end();
const my_iterator begin() const;
const_iterator end() const;
const my_iterator cbegin() const;
const_iterator cend() const;
428デフォルトの名無しさん
垢版 |
2019/04/28(日) 17:18:10.81ID:HBE/zmE6
これで動かん?
for (auto&& _n : _container) {
}
2019/04/28(日) 17:28:42.95ID:UbqPSgHc
>>428
動かないです
2019/04/28(日) 18:12:40.94ID:/ZzCGjK1
MYIteratorの実体がunsigned longみたいだけど
vector<int>::iteratorの実体がポインタだったらoperator!=の定義できなくない?
2019/04/28(日) 18:13:25.64ID:7uO4eV2c
>>420
wandboxで再現コード作って出直すか、それができないんならエスパーに頼んだほうがいいんじゃないかな。
https://mevius.2ch.net/test/read.cgi/tech/1187922645/
2019/04/28(日) 20:53:07.97ID:B+3vkW9O
>>423
bool operator != (〜) const ← これ付け忘れてないか?
2019/04/28(日) 20:57:20.67ID:HwAGJ3yN
constつけ忘れは時々はまる
2019/04/28(日) 23:15:17.87ID:UbqPSgHc
>>427
自己解決
const iteratorとconst_iteratorが一緒だと勘違いしていた
const my_iteratorではなくmy_const_iteratorを実装して返り値とすべきでした
2019/04/29(月) 08:12:30.69ID:caHZo185
struct A{
int member;
};
struct B: A{
void run(){member = 0;}//ok
};

template<typename T>
struct TA{
T member;
};
template<typename T>
struct TB:TA<T>{
void run(){member = 0;}//NG。this->memberとするとok
};
クラステンプレートを継承してクラステンプレートを作成した場合にthisでないと継承元のメンバーが見えないのは仕様?
2019/04/29(月) 10:32:33.68ID:ytpB6N2f
仕様
一寸前までのmsvcではなぜか通っていたけど
2019/04/29(月) 11:47:53.29ID:atpu4K08
>>436
なんでそんな仕様になってるんだろう…
2019/04/29(月) 12:13:25.59ID:TWBg2sM/
>>437
2phase lookupだから
最初のTB解釈時にはTAが型引数一つのtemplate classであるという情報以外使わない
だいたいTAが特殊化される可能性があるだろ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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