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


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

C++相談室 part134



1 名前:デフォルトの名無しさん mailto:sage [2018/01/20(土) 09:05:42.21 ID:mJKRg6iz0.net]
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part133
mevius.5ch.net/test/read.cgi/tech/1511509970/

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

■長いソースを貼るときはここへ。■
 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

110 名前:片山博文MZ mailto:sage [2018/02/10(土) 19:52:35.19 ID:x9I4Wn6Pd.net]
C++では、
int i;
for (i = 0; i < 9; ++i) { ... }
が、
for (int i = 0; i < 9; ++i) { ... }
って書けるのは知っているだろう。( )の中で、変数を宣言できる。

だが、ifやwhileの( )の中で、変数を宣言できることを知らない人は多い。

111 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 04:31:12.99 ID:9irhhPDg0.net]
C++17では
if ( auto v = n; conditions ) {
...
}
が可能になるし、これからは広がってくれるかのう

112 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 06:11:03.22 ID:l3GMmVaq0.net]
>>108
これホント待ち遠しい

113 名前:デフォルトの名無しさん [2018/02/11(日) 17:00:15.07 ID:RGzNlubj0.net]
それほど待ち遠しいか?

114 名前:デフォルトの名無しさん [2018/02/11(日) 17:27:44.93 ID:QA9xO9uU0.net]
待ち遠しくない

115 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 17:34:07.64 ID:A61Ds/EIM.net]
for( ) の制御変数はそのループでしか使わないことが多いから意味あったけど、if( ) でそんなケースはまれだしなぁ
あれば使うけど待ち遠しいって言うほどじゃない気がする

116 名前: mailto:sage [2018/02/11(日) 17:36:34.68 ID:bT0HWvJB0.net]
理想主義的な文法ですが、実効性はあるのか疑問ですね

117 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 17:40:12.67 ID:KWDwqk940.net]
一瞬意図が分からなかったが
()の中が;で区切れるという話?

118 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 17:41:52.24 ID:rD0gl3AiM.net]
dynamic_castとの組み合わせで使うとかどうよ



119 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 19:11:10.58 ID:av7bQMHG0.net]
結構あると思うけどね
if(DWORD err = GetLastError(); err != NO_ERROR)
この場合NO_ERRORが0だって分かってるから
if(DWORD err = GetLastError())
で済むから無意味だけど

120 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 19:17:28.82 ID:yo2OB3cP0.net]
>>116
前者の方が意図が明確だし意味はあると思う

121 名前:デフォルトの名無しさん [2018/02/11(日) 20:06:43.52 .net]
>>116
>if(DWORD err = GetLastError(); err != NO_ERROR)

普通こうやろ
if((DWORD err = GetLastError()) != NO_ERROR)

変数宣言は少しは意味あるかもしれんが(Perlと同じことができるってこと)
複文書けるのは特にメリット感じないわ

122 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 20:41:29.80 ID:Ag9E1Urq0.net]
それ通らんよ
こうだろ

DWORD err;

123 名前:
if((err = GetLastError()) != NO_ERROR)

if内でしか使わないerrが外部に漏れてるのがよろしくないってこと
[]
[ここ壊れてます]

124 名前:デフォルトの名無しさん [2018/02/11(日) 20:56:03.30 .net]
>>119
それが通るという変更だと思ってたわ

こう書けるPerlのほうがまだ優位性あるね

if((my $err = GetLastError()) != NO_ERROR)

125 名前:デフォルトの名無しさん mailto:sage [2018/02/11(日) 22:10:23.49 ID:p+z832PL0.net]
if(init ; expr)だと初期化と式が関連していなくてもいいので>>120とは違う構文になる
だからこんなのでもよい
if(int err = GetLastError(); hoge.aho())

lock_guardもしておける
if(std::lock_guard<std::mutex> lock(m); flag)

構造化束縛も使える
if(auto [a, b, c] = f(); b > c){ std::cout << "b > c" << std::endl; }

126 名前:デフォルトの名無しさん [2018/02/12(月) 12:22:30.52 ID:sATukCOa0.net]
Cでは名前空間っていうのをすごい扱っていた気がするんだけどC++は名前空間扱うことってないの?
一つのアプリケーションも完成させたことがないど素人の質問ですまんが

127 名前:デフォルトの名無しさん mailto:sage [2018/02/12(月) 12:43:48.54 ID:qekpeHDJ0.net]
>>122
まずは"C"の入門書を読んで、何を見間違えたのかはっきりさせてからにしようか。

128 名前:デフォルトの名無しさん mailto:sage [2018/02/12(月) 14:08:57.84 ID:sGdsmrZD0.net]
初心者スレに池



129 名前:デフォルトの名無しさん [2018/02/12(月) 20:44:41.93 ID:gfcybQxo0.net]
>>122
気のせい。

130 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 00:10:36.10 ID:YGwN9DGw0.net]
>>122
Cにnamespaceは無いだろ

131 名前:はちみつ餃子 mailto:sage [2018/02/13(火) 17:30:20.31 ID:tUR5ZBgZ0.net]
構造体タグと型名の名前空間が分かれているといったような意味での名前空間は C に有るが
C++ では構造体タグはそのまま型名としても使えるし、そういう意味での名前空間の話かな?

132 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 17:45:08.06 ID:a1RYP/Gm0.net]
こんな名前空間もあるね
int x;
int main(void)
{
x = 1;
int x;
x = 2;
{
int x;
x = 3;
}
return 0;
}

133 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 17:55:17.58 ID:Xr6xvVy+M.net]
それはスコープでは

134 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 18:15:03.36 ID:a1RYP/Gm0.net]
変数だよ
代入でもあるね

135 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 20:09:02.02 ID:NNOtJgpO0.net]
謎すぎワロタがそこから上のスコープのxを参照してくれ

136 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 20:19:22.41 ID:Za/EZbH7M.net]
ブロックって言ってる

137 名前:デフォルトの名無しさん mailto:sage [2018/02/13(火) 21:49:01.90 ID:a1RYP/Gm0.net]
アホばっかり
がっかり

138 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 12:08:37.28 ID:Sgd3BwBT0.net]
std::mapのように文字列や構造体をキーにした高速アクセスができて、
要素の数が一定数を超えたらLRU形式で勝手に削除してくれる、
キャッシュのような機能を実装したいのだけど、
C++でそのような仕組みを作れるクラスはないですか?



139 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 17:00:44.45 ID:GbCJk+7h0.net]
自分で実装するならどうにでもなるだろ
そのための道具は全て標準で揃っている

140 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 18:15:51.96 ID:6url8MQd0.net]
バックグラウンドならスレッド使うしかないんじゃないかな

141 名前:デフォルトの名無しさん [2018/02/15(木) 19:13:27.39 ID:CSnzpiZpM.net]
C++のプログラマーって性格ねじ曲がってるなあ
初めてGo応援したくなったわ

142 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 19:34:35.63 ID:95vLe5Bi0.net]
>>137
どんな点が、性格悪い、と思わせるのですか?

143 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 20:03:21.73 ID:qihnyYvs0.net]
それだよそれ

144 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 21:14:35.68 ID:MoAPifjS0.net]
C++は多分チューリング完全だと思う

145 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 21:20:32.50 ID:6nYos/bmM.net]
>>136
要素数が閾値を超えるのは要素が追加される時だからその時に古い奴を削除すりゃいいだけじゃね?

146 名前:デフォルトの名無しさん mailto:sage [2018/02/15(木) 23:50:52.95 ID:fG1U9Z3qM.net]
>>135
簡単で良いのでサンプルコード書いてもらえませんか?

147 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 00:43:14.82 ID:uaG+5sVQ0.net]
>>135じゃないけどシンプルにいくなら
{
map<key,value> data; // 本来のデータ
map<key,list<key>::iterator> lruindex; //
list<key> lrulist; // LRUリスト
... // mapと同じインターフェイス
}
みたいなクラスで要素の追加・削除・参照とかの時にLRUリスト見て処理すればいい

148 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 03:16:29.76 ID:DpsRPWWQ0.net]
辞書・線形リスト・2分木を、組み合わせる。Ruby で書くと、

class LRU_hash
def initialize (max_size = 3)
# ary は、hash に追加・アクセスした順
@hash = {}; @ary = []
@max_size = max_size
end

def push (key)
if @hash.has_key? key
# 一旦、要素を削除してから、最後尾に追加しなおす
@ary.delete key
else
if @max_size == @hash.size
# 先頭要素を削除してから、最後尾に追加する
@hash.delete(@ary.shift)
end
@hash[key] = true
end
@ary.push key
end

def print_buf
puts @ary.join ', '
end
end

ary = ["あ", "a", "あ", "い", "b", "あ", "c"]
hash = LRU_hash.new 4
ary.map { |key| hash.push key }
hash.print_buf #=> い, b, あ, c



149 名前:デフォルトの名無しさん [2018/02/16(金) 04:31:51.17 .net]
>>144
> # ary は、hash に追加・アクセスした順

参照のたびに最後尾に追加しなおすの?

150 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 06:27:04.53 ID:HICjIKnm0.net]
プログラムを作っていて困っています。
プログラム動作環境、windows 7 x86_x64

プロセスをExplorerを親として、
起動したプロセスにファイルの存在するディレクトリを作業ディレクトリとして
割り当てたい。

ただし、プロセスへのアタッチによる変更は禁止とする。

ようするにファイルをダブルクリックして起動するのと同じ状況を再現したいのです。



C:\hoge\fuga.exe

[現状]
Explorer C:\hoge\fuga.exe

explorer.exe
カレントディレクトリ
C:\Windows\System32\

[理想]
Explorer C:\hoge\fuga.exe

explorer.exe
カレントディレクトリ
C:\hoge\

151 名前:144 mailto:sage [2018/02/16(金) 07:56:00.35 ID:DpsRPWWQ0.net]
>>145

>>134
で、LRU と書いてあるから、Hash に追加しようとした度に、
すでに存在する場合でも、配列の最後尾に追加しなおした

どういう意味か、正確にはわからないけど

152 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 08:03:01.53 ID:TOIQut300.net]
>>146
explorer.exeへのショートカットを作ってプロパティで作業ディレクトリを指定するか、
COMでIShellLink::SetWorkingDirectoryを使って同じことをするあたりか?

153 名前:134 mailto:sage [2018/02/16(金) 09:56:21.20 ID:+b2iJMK40.net]
みなさんありがとうございます。
std::mapにLRUや最大要素数の仕組みを持たせた派生クラスでも
無いかと思ったのですが、標準ではやっぱり無いですか。

>>143のように、std::mapをメンバの一つに持たせた独自クラスを
一から作っていくことになるんですかね。

154 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 10:11:55.71 ID:JoalkiMd0.net]
amazonランキングの謎を解く とか言う本でmove-to-frontを見た

本の紹介「Amazonランキングの謎を解く」
www.kenkyuu.net/whatsnew/2011/08/book2011-08-01.html
>「move-to-front規則」(最後に売れた順に並べる、つまり、注文のたびに1位にジャンプする)

Move To Front - Wikipedia
https://ja.wikipedia.org/wiki/Move_To_Front

155 名前: []
[ここ壊れてます]

156 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 10:54:10.09 ID:TOIQut300.net]
ageだね

157 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 14:25:37.67 ID:UjPhOEUu0.net]
>>149
「c++ lru map」でググったか?
いくつかサンプルになりそうなコードが見つかるんだけど

158 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 18:05:58.99 ID:GGXfeEqkM.net]
江添さんのC++17本予約しようかな



159 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 18:26:06.12 ID:waI0am5S0.net]
予約しなくても売れ残るからいつでも買える

160 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 20:04:35.13 ID:1Lr9lxEpa.net]
C++を勉強しようと思ってる者ですが書籍を探しております。Cはある程度書けるのでそれを前提とした書籍が欲しいです

161 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 20:33:50.33 ID:Rc+MuzY40.net]
C++ クイック入門&リファレンス
プログラミング言語C++ 第4版

162 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 20:36:34.10 ID:9b60nRDg0.net]
>>155
C++11 以前だが accelerated c++, ここでフォローするよ

163 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 20:37:11.23 ID:TOIQut300.net]
禿4は俺も推奨する
C++11の良本だ

164 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 21:09:12.34 ID:+EaaPhKWa.net]
めっちゃ高いけどその価値あるのね

165 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 21:46:03.21 ID:5AmFsIq1M.net]
こっちはフッサフサやでhttps://images-na.ssl-images-amazon.com/images/I/51fYzbYoXFL._UX250_.jpg

166 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 22:03:34.89 ID:qDhjnryl0.net]
誰がハゲやねん

167 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 09:43:48.64 ID:Lqib7/b9F.net]
以下のようにconst char*型の文字列でchar*型の変数を初期化したいときに
strcpyやstrlenを書かずにstd::stringを利用して短くかけないかと思うのですが
msvcだとエラーにならず、clang, gccだとdeleteでセグメンテーション違反になります。
どうすればより良い感じになるでしょうか?const_castはできれば使いたくないです。

#include <string.h>
#include <string>
#include <iostream>
int main()
{
const char* asdf = "asdf";
// char* psz2 = new char[strlen(asdf)+1];
// strcpy(psz2, asdf);
std::string *psz = new std::string(asdf);
char* psz2 = &(*psz)[0];

std::cout << psz2 << std::endl;
delete psz2;
return 0;
}

168 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 09:51:35.08 ID:mykV+fTk0.net]
delete psz2なんてしちゃだめconst関係ない



169 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 10:21:38.22 ID:4SqFrjwY0.net]
何故stringそのものじゃなくて内部データをdeleteしようと思ったのか
newで確保した配列じゃないからdeleteはできない
stringの内部データは静的な配列と動的な配列を組み合わせて表現されている
mscvの場合先頭16文字はchar[16]でそれ以降は動的な配列に入るようになっている
psz[0]のアドレスはchar[16]の先頭アドレスなので当然deleteできない
msvcはdeleteに失敗しても落ちないのかな

170 名前:デフォルトの名無しさん [2018/02/17(土) 10:47:53.57 ID:IU1gsQgu0.net]
>>155-159
本格的な本なら、ロベール、ハーバート・シルトの独習

軽めの本なら、柴田 望洋、林 晴比古、猫

171 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 11:22:13.08 ID:++v6vSjK0.net]
ハンガリー人まだ絶滅してないのか。
stringはnull terminatedでないからpszはおかしい。
psz2もnull terminatedの保証がないからc_strを使うべき。
うまくいったらstrdupも調べとこうな。

172 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 11:25:45.81 ID:szUqPRvW0.net]
>>162
char* psz2 = &(*psz)[0]; って
char* psz2 = psz->c_str(); と同じなのかな?

いずれにせよ delete psz; は出来る(するべき?)だけど、
delete psz2; は出来ないんじゃないかな。

173 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 11:30:29.43 ID:mykV+fTk0.net]
必要ないところでnew/delete使う人は根本からして

174 名前:何も分かってない []
[ここ壊れてます]

175 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 15:18:23.73 ID:YAgvIyFy0.net]
>>162
お前はstringがただの配列だと思っているのか?
このトンチキ野郎!

176 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 16:50:38.35 ID:Q4Uv6cZz0.net]
>>162
弁護士の唐沢です
しっかり「char* const」と「const char*」の違いを認識しなさい
const char*は参照先の定数を変更しない事を保証する宣言であり、char*は参照先の定数を変更できる為、const char*で保持するアドレスをchar*にコピーする事は言語仕様により禁止されています。それは分かるよね?
最初に宣言したポインタを間違えて別アドレスで上書きしないようにconstで固定したいのなら、char* constを使うようにしましょう。とりあえずとりいそぎ

177 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 17:22:58.60 ID:0j+aLKWi0.net]
>>162
strdupという手があるが何がしたいのか今一つ分からない

const char* asdf = "asdf";
char *p = strdup(asdf);
std::cout << p << std::endl;
delete p;

178 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 17:31:15.32 ID:CLg9GPlRM.net]
>>170
それ誰に指摘してんの?とりいそぎ。



179 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 17:34:22.09 ID:4SqFrjwY0.net]
>>167
データは連続しているので同じになる
16文字まではスタックを使い、それ以上の長さになるとヒープにコピーされる
実装ではメンバの配列には何かしらのエスケープ文字が入る
ちなみにmsvcでは実装の都合上free(&str[0])で強引に解放できる

180 名前:173 mailto:sage [2018/02/17(土) 17:49:08.26 ID:4SqFrjwY0.net]
補足
スタックとヒープを使い分けるかどうかは実装依存
gcc、clang、msvcでは行われている
したがって短い文字列でnewを避けるためにstringを使わないというのは意味が無い

181 名前:デフォルトの名無しさん [2018/02/17(土) 18:06:03.81 .net]
>>171
strdupで確保した領域をfreeでなくdeleteするのは正しいの?

182 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 18:09:26.31 ID:Lp1rq1Kt0.net]
良いみたいだ
中でmallocで確保している

183 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 18:10:04.88 ID:Lp1rq1Kt0.net]
違う、freeで開放する

184 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 18:14:21.37 ID:Q4Uv6cZz0.net]
>>175
弁護士の唐沢です
mallocとdeleteは併用厳禁です。freeを使用してください

185 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 18:18:24.62 ID:DOQJ47ER0.net]
昔から気になってるんだが「解放」だよね...

186 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 18:25:00.27 ID:Lp1rq1Kt0.net]
そうでした、ごめんね

187 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 18:25:45.10 ID:JVoP/9zU0.net]
>>176
良くねえだろ ぼけ

>>179
開放はpublic的なニュアンスだよな

188 名前:はちみつ餃子 mailto:sage [2018/02/17(土) 18:45:39.74 ID:uBckbaXI0.net]
>>162
ぶっちゃけた話、 strcpy が一番短いと思う。



189 名前:デフォルトの名無しさん [2018/02/17(土) 18:59:50.35 .net]
>>182
strdup という答えが出てるのに何言ってるの?

190 名前:はちみつ餃子 mailto:sage [2018/02/17(土) 19:05:58.96 ID:uBckbaXI0.net]
>>183
strdup は C++ の仕様の範囲内ではないので……。
POSIX と MSVCRT に有るからほとんどの場合に十分といえば十分なのかもしんないけど。

191 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 19:07:20.59 ID:u7LZaTzx0.net]
>>166
接頭辞を見ればデータ内容の属性がワカルというメリットは他に代え難い
ttp://local.joelonsoftware.com/wiki/間違ったコードは間違って見えるようにする

あといちいちthis->xと書くよりも、すすんでm_xと書きましょう

192 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 19:21:01.63 ID:u7LZaTzx0.net]
strdup()だと明示的に開放コードをどっかに書かなくてはならなくて必ず忘れるので
せっかくC++なのでスマポ的にwrapすると良いと思う

193 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 19:37:41.81 ID:JVoP/9zU0.net]
ホワイトボックスなCでは許せるが
ブラックボックスなC++の流儀には全く合わない
それがstrdup

194 名前:167 mailto:sage [2018/02/17(土) 19:53:11.68 ID:szUqPRvW0.net]
>>173-174

195 名前:えてくれてありがとう。
返されるアドレスは等しい値なのか、という単純な質問だったんだけど、
読み直してみたら分かりにくい質問文だと思っていた次第。

それにしても &(*psz)[0] って結構ややこしいのね。
オーバーロードされた[]演算子が返すcharへの参照、
に対してアドレス演算子&を作用させた結果、て感じかな。
[]
[ここ壊れてます]

196 名前:162 mailto:sage [2018/02/17(土) 20:37:30.76 ID:uaRb1j8RM.net]
すみません、たくさんレスありがとうございます。
_strdupにしてみたら期待の動作ができました。
ありがとうございました。

197 名前:162 mailto:sage [2018/02/17(土) 21:27:34.68 ID:uaRb1j8RM.net]
また質問してすみません。
msvc(vs2017)だとコンパイラをC++17にしても以下のプログラムで
C2664 'void (T *&)': 引数 1 を 'hoge *' から 'hoge *&' へ変換できません。
となってしまうのですが、コードにバグが有るでしょうか?msvcのバグでしょうか?
GCCやClangではコンパイルできます。

#include <memory>
struct hoge {};
template <class T>
inline void safe_delete(T*& p) {
if (p) {
delete p;
p = nullptr;
}
}
int main() {
std::unique_ptr<hoge, decltype(&safe_delete<hoge>)> sp{new hoge(), safe_delete<hoge>};
return 0;
}

198 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 22:11:53.16 ID:IU1gsQgu0.net]
(T *&)

そもそも、ポインタ・参照を、同時に使えるのか?



199 名前:片山博文MZ mailto:sage [2018/02/17(土) 22:23:52.63 ID:EwTJGG8Pd.net]
new hoge()は変数じゃないから、代入できない。

200 名前: mailto:sage [2018/02/17(土) 22:35:58.53 ID:I0BNlfaX0.net]
>>165
独習C++ はいいですね、特に演習問題「std::stringを再実装する」を絶賛します
これが書けるようになったらC++初級者をかたってもいいかもしれない、もしかすると解答は載ってなかったかもしれないけれども

201 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 22:35:58.70 ID:++v6vSjK0.net]
>>185
どこから引用したのか知らんけど、そのページ読んでないだろ…
システムハンガリアンはまるで役に立たないって書いてあるぞ。

202 名前: mailto:sage [2018/02/17(土) 22:43:42.94 ID:I0BNlfaX0.net]
>>194
(システム)ハンガリアンってそんなに悪いものなんですかねえ
いや、win32api がバンバンハンガリアンしているので、そんなもんか、と思っていましたが

203 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 22:51:12.84 ID:++v6vSjK0.net]
>>195
OOPともTMPとも型推論とも相性が悪いからね。
MS自身ももう使うなって言ってる。

204 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 22:52:19.16 ID:YAgvIyFy0.net]
頭悪いヤツが多様するハンガリアン

205 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 22:54:25.25 ID:YAgvIyFy0.net]
嫌いだからハンガリアン意地でも使わなかった
dwやらszやらせっかくのフリーフォーマッとが台なしだよ

206 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 22:59:56.16 ID:Q4Uv6cZz0.net]
フリーフォーマットはクソコードの温床ナリよ

207 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 23:03:12.11 ID:4SqFrjwY0.net]
型を変えるたびに変数名も変えるのか
ごくろうやな

208 名前: mailto:sage [2018/02/17(土) 23:08:35.57 ID:I0BNlfaX0.net]
>>191
それは「ポインタ変数の参照」で、たしか便利に使えた気がしますが…
明日にでもちょっと書いてみます、今日は疲れました…



209 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 23:22:18.45 ID:2kmwzB0g0.net]
>>195
システムハンガリアンは弊害ばかりだろうけど、アプリケーションハンガリアンは適切に使えば有益だよ。

210 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 23:25:09.87 ID:4SqFrjwY0.net]
mとかいらなくねってなって削ったら_から始まるようになった






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

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

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