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


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

C++相談室 part164



1 名前:デフォルトの名無しさん (ワッチョイ 33da-QP0H) mailto:sage [2023/05/09(火) 11:50:52.06 ID:EYc2I7oW0.net]
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part163
https://mevius.5ch.net/test/read.cgi/tech/1672409791/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

231 名前:デフォルトの名無しさん (ワッチョイ 6128-l8k0) mailto:sage [2023/06/17(土) 15:30:36.02 ID:S+64vkUJ0.net]
>>216
vectorのcapacityはそのvectorが氏ぬかcapacity縮小アクションが生じない限りvector固有に占有されるから
capacity(のうちsize()を超える分)と OS側からみた空きメモリはまた別でケテーイ……
一方malloc()がOSからゲットしたメモリをOSに返さずにいるのはOS側からみた空きメモリではないにしろ
同一プロセス内の他のオブジェクトの構築に使えるのだから空きメモリのうち
これすらもOSに返したいということならこの流れの中で現状答えがでていないキモヌ

232 名前:デフォルトの名無しさん (ワッチョイ 6128-l8k0) mailto:sage [2023/06/17(土) 15:31:34.82 ID:S+64vkUJ0.net]
まあしいて言えばプロセスを一旦exitして再立ち上げ?

233 名前:デフォルトの名無しさん (ワッチョイ 6128-l8k0) mailto:sage [2023/06/17(土) 15:45:09.56 ID:S+64vkUJ0.net]
普通に作ったら(コードで明示的に直接OSのAPIでメモリを分捕って解放とかしない限りは
プロセスのprivate bytesはプロセスが氏ぬまで増えることはあっても減ることは無いという印象、

234 名前:デフォルトの名無しさん (ワッチョイ 7d9b-trtU) mailto:sage [2023/06/17(土) 16:27:35.20 ID:5e+acAEX0.net]
>>225
スマンまじで理解できないのだけど、なぜvectorに限った話をしてるの?

235 名前:デフォルトの名無しさん (テテンテンテン MM96-Axrn) mailto:sage [2023/06/17(土) 19:22:00.09 ID:mYwWSuEFM.net]
>>231
巨大インスタンスは>227

236 名前:デフォルトの名無しさん (ワッチョイ d9ab-trtU) mailto:sage [2023/06/17(土) 19:29:36.10 ID:HtrmHz3i0.net]
回答者のレベル低いな~~~
こんだけダラダラ続けて、結局質問者>>182>>190で早々に結論づけてることをリピートしてるだけw

237 名前:デフォルトの名無しさん (ワッチョイ 69f0-J7ro) mailto:sage [2023/06/17(土) 19:54:50.95 ID:9hSxsWrs0.net]
アロケータ気に入らないなら自作くらいしろよポンコツ
なにもかもSTLに頼りやがってそれでPGやってるつもりになるなよ

238 名前:デフォルトの名無しさん (ワッチョイ 6128-l8k0) mailto:sage [2023/06/17(土) 20:19:47.36 ID:S+64vkUJ0.net]
人類には早すぎた話題また……

239 名前:デフォルトの名無しさん (オイコラミネオ MM91-L1I+) mailto:sage [2023/06/17(土) 23:14:07.63 ID:H9lc23A5M.net]
次世代の人は便利に使いこなしてるかより簡素になった仕組みを使うのだろう



240 名前:デフォルトの名無しさん (ワッチョイ 655f-rdTE) mailto:sage [2023/06/18(日) 03:00:55.26 ID:GIMFAM+a0.net]
>>231
コンテナの種類を問わない一般的な方法なんてものはないからじゃないですかね

241 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/18(日) 21:04:45.70 ID:VwYqKwPk0.net]
以下のコードでaccumulateのとこでコンパイルエラーが起こります
何故か分かります?
#include <iostream>
#include <array>
#include <deque>
#include <exception>
#include <numeric>
using Vector = std::array <double, 3>;
using Vector_Container = std::deque <Vector>;
Vector &operator += (Vector &lhs, const Vector &rhs) {
const auto size {lhs.size ()};
if (size != rhs.size ()) throw std::runtime_error ("Sizes are different.");
for (size_t i {0}; i < size; ++ i) lhs [i] += rhs [i];
return lhs;
}
Vector operator + (const Vector &lhs, const Vector &rhs) {
Vector result {lhs};
result += rhs;
return result;
}
int main () {
Vector v0 {0, 1, 2}, v1 {10, 11, 12};
Vector_Container c0 {v0, v1};
accumulate (c0.begin (), c0.end (), Vector {}); // コンパイルエラー
return 0;
}

242 名前:デフォルトの名無しさん (ワッチョイ 515f-C6j3) mailto:sage [2023/06/18(日) 21:45:44.90 ID:UCXMUPHB0.net]
>>238 エラーメッセージ見ればたぶん分かる。

243 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/18(日) 21:48:16.43 ID:VwYqKwPk0.net]
>>239
レス有難うございます
まず訂正
-accumulate
+std::accumulate
全部は貼れないですけど大事そうなところ

In file included from /usr/include/c++/12/numeric:62,
from test1.cpp:18:
/usr/include/c++/12/bits/stl_numeric.h: In instantiation of ‘constexpr _Tp std::accumulate(_InputIterator, _InputIterator, _Tp) [with _InputIterator = _Deque_iterator<array<double, 3>, array<double, 3>&, array<double, 3>*>; _Tp = array<double, 3>]’:
test1.cpp:22:14: required from here
/usr/include/c++/12/bits/stl_numeric.h:141:46: error: no match for ‘operator+’ (operand types are ‘std::remove_reference<std::array<double, 3>&>::type’ {aka ‘std::array<double, 3>’} and ‘std::array<double, 3>’)
141 | __init = _GLIBCXX_MOVE_IF_20(__init) + *__first;

244 名前:デフォルトの名無しさん (ワッチョイ 9e81-L1I+) mailto:sage [2023/06/18(日) 23:15:51.41 ID:w3/xAOT+0.net]
ADLでoperator+が見つからないからかな?
struct Vector : std::array <double, 3> {};
みたいに定義したらいけるのでは

245 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/18(日) 23:20:13.62 ID:VwYqKwPk0.net]
>>241
>struct Vector : std::array <double, 3> {};
>みたいに定義したらいけるのでは
通りますね
どういうこと?

246 名前:デフォルトの名無しさん (ワッチョイ 32fb-9xvA) [2023/06/18(日) 23:24:52.33 ID:bX3uBTIT0.net]
std::accumulateが14行目で定義したoperator+を見つけれてないのが原因っぽい。

std::accumulateの第4引数に
[](const Vector& v1, const Vector& v2){ return v1+v2;}
を追加してやるとコンパイルは通る。

14行目のoperator+をstd名前空間に入れてやれば動くにゃ動くけど色々マズいので(調査する分にはいいけど)最終的な解答にはならないかな

247 名前:デフォルトの名無しさん (ワッチョイ 32fb-9xvA) [2023/06/18(日) 23:29:04.68 ID:bX3uBTIT0.net]
>>242
たぶんC++コンパイラはoperator+の候補を検索するときに
Vector( = std::array<double, 3>)と同じ名前空間にあるものしか検索しない

Vectorのクラ

248 名前:ス定義そのものがグローバル名前空間にあるなら14行目のoperator+を見つけられるけど、
今はVectorの正体はstd::array<...>なのでstd名前空間しか検索しないんだと思う
[]
[ここ壊れてます]

249 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/18(日) 23:39:19.50 ID:VwYqKwPk0.net]
>>243,244
なるほど解説頂きまして有難うございます
グローバルスコープはどっからでも見えて良さそうなものの
何でグローバルスコープの関数を探さないですかね?



250 名前:デフォルトの名無しさん (ワッチョイ a901-UvLK) [2023/06/18(日) 23:48:03.44 ID:EGGkT3O00.net]
独自のメンバ変数を持たないのなら継承してしまうのも手ではある(ただしコンストラクタやarrayを受け取るキャスト用コンストラクタとか書く必要が出ると思うけど)
ただ、そもそもカスタマイズしたり自分の用途に本当に使いやすいものを作りたいなら、ちゃんと自分で全部書いた方がいいと思うよ

251 名前:デフォルトの名無しさん (ワッチョイ b110-lSMs) mailto:sage [2023/06/19(月) 00:42:02.49 ID:2lgIrH6A0.net]
>>245
std::accumlateの定義内からだと、その下の方(ユーザーコード)で定義されてるoperator+は見えてないので、グローバル名前空間の探索では見つからない

252 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/19(月) 00:52:39.28 ID:Q4g6N6uX0.net]
>>247
std::accumlateが定義されているnumericをincludeする前に
以下のようにグローバルスコープにプロトタイプを置いても
同じようにoperator+が見えてないとエラーが出ます
using Vector = std::array <double, 3>;
Vector operator + (const Vector &lhs, const Vector &rhs);
#include <numeric>

253 名前:デフォルトの名無しさん (ワッチョイ a901-UvLK) [2023/06/19(月) 03:40:46.00 ID:RYn53SnN0.net]
accumlateは関数テンプレートだから実体化される時点でoperator+が見えてりゃOKのはず
言われてる通りADLで対象外なのが問題

254 名前:デフォルトの名無しさん (ワッチョイ 256b-trtU) mailto:sage [2023/06/19(月) 05:38:23.58 ID:JAsvvATP0.net]
>>237
(スマート)ポインタで持って要らなくなったら明示的にリリースする方法はあらゆるコンテナに対して使えるよね?笑

255 名前:デフォルトの名無しさん (ワッチョイ f59c-Axrn) mailto:sage [2023/06/19(月) 08:48:03.43 ID:KLBRX38t0.net]
>>250
>>223

256 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/19(月) 09:20:16.57 ID:Q4g6N6uX0.net]
>>249
有難うございます
グローバルスコープに定義した関数が見えないのは
どうしてなんでしょうかね?
それでは全然グローバルじゃないような気がするのですが
規格を決めるときに何か意図があったのでしょうかね?

257 名前:デフォルトの名無しさん (ワッチョイ a901-UvLK) [2023/06/19(月) 10:39:37.41 ID:RYn53SnN0.net]
そもそもが名前空間内(よその演算子と混ざらないように)にある演算子オーバーロードを、外部からでも引数が合えば使えるように(std::operator+(a, b)とか書かないでいいように)するためのルールらしいから
外部の演算子見に行くのは

258 名前:レ的に合わんのじゃね

std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、あまりよろしくないやり方しようとしてると考えた方がいい
(だから>>246のように書いた、継承したら一応arrayではなくちゃんとVectorクラスに対する演算子だから通る)
[]
[ここ壊れてます]

259 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/19(月) 11:53:54.08 ID:Q4g6N6uX0.net]
>>253
>std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、
>あまりよろしくないやり方しようとしてると考えた方がいい
なるほど
たぶんこういう考え方なんでしょうね



260 名前:デフォルトの名無しさん (ワッチョイ 5efb-+wmN) mailto:sage [2023/06/19(月) 12:20:34.90 ID:4PINPeBN0.net]
つまりvector<int>を使いなさいということ

261 名前:デフォルトの名無しさん (ワッチョイ 7d9b-trtU) mailto:sage [2023/06/19(月) 12:21:25.69 ID:wGtx/iKL0.net]
>>251
安価ミス

262 名前:デフォルトの名無しさん (アウアウウー Sacd-9XmN) mailto:sage [2023/06/20(火) 00:04:57.81 ID:YSi65ASja.net]
実引数依存の名前探索、Argument-Dependent Lookup (ADL)は、
Koenig lookup とも言う

「Cプログラミングの落とし穴」の著者、
Koenigが、C++ に入れる事を推奨した

ADLを知っているなら、かなりのプロと言える

263 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/20(火) 00:18:46.72 ID:vGfe0Eju0.net]
勉強になります

264 名前:デフォルトの名無しさん (アウアウウー Sacd-9XmN) mailto:sage [2023/06/20(火) 02:12:24.83 ID:1vctBLGTa.net]
演算子のオーバーロードなら、フレンド関数とか?

非メンバの演算子オーバーロード | Programming Place Plus C++編【言語解説】 第35章

https://programming-place.net/ppp/contents/cpp/language/035.html

265 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/20(火) 10:05:39.77 ID:IIzrqfbq0.net]
状況を簡略化するとこう。

namespace ns {
struct foo {};
template <class T>
void bar(const T&) {
T() + T();
} };

ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); }

int main() { bar(ns::foo()); }

ADL は「通常の探索に加えて」関連する名前空間も探索対象にするルールなのでグローバル名前空間も探索対象になるが、通常の探索では後ろで宣言 (定義) されているものは見つけることができない。 この場合はエラーとして検出されるけど、可視な宣言と実際の定義の集合に食い違いは未定義という解釈でいいと思う。 (ちょっと自信はない……。)
だから順序を変えれば通る。

namespace ns {
struct foo{};
};

ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); }

namespace ns {
template <class T>
void bar(const T&) {
T() + T();
} };

int main() { bar(ns::foo()); }

当然ながら std の (というかそれに限らず既存のライブラリの) 宣言の順序をどうこうするわけにもいかないので無理にカスタムしようとするのは筋が悪いということになる。

266 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/20(火) 10:53:08.18 ID:vGfe0Eju0.net]
>>260
>だから順序を変えれば通る。
最近手元のg++を更新しまして10.2.1 -> 12.2.0になったんですが
前者のケースが通らなくなりまして疑問に思っていたところでした
10.2.1は寛容で両方とも通るけどC++的には後者のみ通るのが正しい?

267 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/20(火) 11:41:30.21 ID:IIzrqfbq0.net]
>>261
前者はたぶん未定義かつ診断不要な状況なのでエラーを検出せずに通すのも正しい挙動で
プログラマがそういう状況を作ってしまうのが仕様に反する (というか結果が保証されない) という解釈になると思う。

268 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/20(火) 13:36:04.44 ID:vGfe0Eju0.net]
なるほどー
有難うございます

269 名前:デフォルトの名無しさん (JP 0H91-FhUT) [2023/06/20(火) 21:39:35.82 ID:Pk8V/jejH.net]
template<typename Callback>
void func(Callback cb)
{
//cb(1); // A
//cb(1,2);// B
}

void f1(int){}
void f2(int,int){}

int main(){func(f1);}

AとBをコンパイル時に呼び分けたいんですけど
どのように記述すればよいか教えていただけませんか?



270 名前:デフォルトの名無しさん (ワッチョイ 515f-9XmN) mailto:sage [2023/06/20(火) 22:18:37.18 ID:Cuq1USIJ0.net]
is_invocableでおk

271 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/20(火) 22:21:49.81 ID:IIzrqfbq0.net]
>>264
渡されたコールバック関数の引数の数によって区別するってこと?
素朴な方法だとオーバーロードするのが手っ取り早いと思う。

void func(void (*cb)(int)) {
cb(1);
}

void func(void (*cb)(int, int)) {
cb(1, 2);
}

void f1(int) {}
void f2(int, int) {}

int main() {
func(f1);
func(f2);
}

272 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/20(火) 22:27:55.14 ID:vGfe0Eju0.net]
>>264
template<typename Callback> void func(Callback cb);
template <> void func(void (*cb) (int))
{
(*cb)(1); // A
}
template <> void func(void (*cb) (int, int))
{
(*cb)(1,2);// B
}
void f1(int){}
void f2(int,int){}
int main(){func(f1);}

273 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/20(火) 22:29:12.98 ID:vGfe0Eju0.net]
templateが意味ないね

274 名前:デフォルトの名無しさん (ワッチョイ 127f-L1I+) mailto:sage [2023/06/20(火) 22:39:00.27 ID:ui/rWsWf0.net]
265が言うようにis_invocable使うとこんな感じ?

template<typename Callback>
void func(Callback cb)
{
if constexpr (std::is_invocable_v<Callback, int>) {
cb(1);
} else if constexpr (std::is_invocable_v<Callback, int, int>) {
cb(1,2);
}
}

275 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/20(火) 22:41:37.75 ID:vGfe0Eju0.net]
>>269
これって関係ないif節はコンパイル時に消えるの?

276 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/20(火) 22:43:20.79 ID:IIzrqfbq0.net]
>>270
消えるよ。

277 名前:デフォルトの名無しさん (JP 0H91-FhUT) [2023/06/20(火) 22:44:14.18 ID:Pk8V/jejH.net]
>>269
ありがとうございます。
gcc 13.1.0 でc++17でうまくいきました。

後出しで申し訳ありませんが、C++14でかけませんか?

278 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/20(火) 22:47:27.45 ID:vGfe0Eju0.net]
>>269,271
これは知らんかった
勉強になるなぁ

279 名前:デフォルトの名無しさん (JP 0H91-FhUT) [2023/06/20(火) 22:48:18.64 ID:Pk8V/jejH.net]
>>269
まさにこれをやりたかったです。

template<typename Callback>
void func(Callback cb)
{
// こことか

if constexpr (std::is_invocable_v<Callback, int>) {
cb(1);
} else if constexpr (std::is_invocable_v<Callback, int, int>) {
cb(1,2);
}

// ここをどうしようか悩んでいました
}



280 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/20(火) 22:59:00.24 ID:IIzrqfbq0.net]
>>272, >>274
ひとつの関数テンプレート中でやりたいってこと?
if constexpr が導入される前だとオーバーロードなり特殊化なりで
別の関数として分離しないと書けないと思う。

is_invocable に相当するものは自分で書こうと思えば書けるが
if constexpr は言語のコアの機能だからどうにもならんし……。

281 名前:デフォルトの名無しさん (JP 0H91-FhUT) [2023/06/20(火) 23:14:31.48 ID:Pk8V/jejH.net]
>>275
情報ありがとうございます

ご掲示いただいたコードで勉強になりました。

282 名前:デフォルトの名無しさん (ワッチョイ 69f0-J7ro) mailto:sage [2023/06/20(火) 23:42:05.71 ID:zCL4VLm70.net]
>>273
ザッツcostexprマジック

283 名前:デフォルトの名無しさん (ワッチョイ 69f0-J7ro) mailto:sage [2023/06/20(火) 23:43:57.61 ID:zCL4VLm70.net]
n抜けてたwコストがかかる演算なのは確かだけどw
constexprマジック!マジック!

284 名前:デフォルトの名無しさん (ワッチョイ 32fb-dYQK) [2023/06/21(水) 00:07:10.76 ID:2lh42auf0.net]
C++11のSFIANE地獄へようこそ
https://wandbox.org/permlink/2sfUVeEBrErqvI2R

template関数の実体化が1つだけ成功して、
他が失敗するように仕掛ければ呼び分けは可能。

ただ見ての通り相当面倒なことを書かなきゃならない。

285 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/21(水) 00:28:02.40 ID:CWKUsltc0.net]
>>279
>>266と本質的に何が違うのか分からない
解説よろしく
(templateでやってることは無駄なのでは?)

286 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/21(水) 00:41:42.51 ID:3HBFHOpK0.net]
>>280
いや、 >>279 のほうがちょっと柔軟で使いやすい。
たとえば

void f3(long int, long int) {}

みたいなのを渡したとき >>266 ではエラーになる。
引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと
厳密に int そのものでなければならないというのとでは制約の厳しさが違う。

287 名前:デフォルトの名無しさん (ワッチョイ 515f-9XmN) mailto:sage [2023/06/21(水) 00:42:09.27 ID:LxMKpynY0.net]
templateでやるのは質問者の与えた要件だな
宿題なんじゃね、しらんけど

288 名前:デフォルトの名無しさん (ワッチョイ 32fb-9xvA) [2023/06/21(水) 00:52:13.25 ID:2lh42auf0.net]
C++14にはif constexprが存在しないから
template使ったオーバーロードしか手段がない

質問者がC++14環境でって言ってたからこんなクソ面倒くさいことやれば一応できるっていう例示

289 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/21(水) 01:17:47.52 ID:CWKUsltc0.net]
>>281,283
ありがとう
>引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと
>厳密に int そのものでなければならないというのとでは制約の厳しさが違う。
こういうことね



290 名前:デフォルトの名無しさん (ワッチョイ a901-UvLK) [2023/06/21(水) 04:29:46.61 ID:IDPPhD2V0.net]
>>260
あー本来グローバルも対象になるのか、適当こいてスマソ

だが>>248で質問者が言ってるように、元のコードで順序を変えてもダメなのよ
何故か考えてはちみつのコードを以下のようにしたら同様に通らなかった

namespace ns {
template <class T = int>
struct foo{};

// added
struct hoge{};
int operator +(const hoge &x, const hoge &y) {return 1;}
};


ns::foo<> operator+(const ns::foo<>& x, const ns::foo<>& y) { return ns::foo<>(); }

namespace ns {
template <class T>
void bar(const T&) {
T() + T();
} };

int main() { bar(ns::foo<>()); }

すでに名前空間内に同名の関数があった場合はダメっぽい

291 名前:デフォルトの名無しさん (ワッチョイ a901-UvLK) [2023/06/21(水) 09:44:10.00 ID:IDPPhD2V0.net]
あ、すまんfooがクラステンプレートになってるの直し忘れた(直しても同じだが)

292 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/21(水) 10:22:19.76 ID:3HBFHOpK0.net]
>>285
名前探索 (name lookup) は狭い名前空間から探索していって
合致する名前があればそれより外側に同名の関数があっても
オーバーロード解決に参加しない。

わかりやすい例で言えばメンバ関数は非メンバより優先されるし、
メンバ関数内にひとつでも候補が見つかった時点で非メンバ関数は一切考慮に入らなくなる。

void foo(void) {}

struct bar {
void baz(void) {
// この foo は bar::foo のこと
// 名前が見つかった時点でそれより外の名前空間は見に行かないので
// 引数が合わなくても他の候補は試みられずエラーになる。
foo(1);
}
void foo(void) {}
};

293 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/21(水) 10:34:08.97 ID:3HBFHOpK0.net]
例をちょっと間違えたのでやりなおし。

void foo(int) {}

struct bar {
void baz(void) {
foo(1);
}
void foo(void) {}
};

こうすると非メンバ関数の foo は候補にすらならないという話。

294 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/21(水) 11:00:59.24 ID:CWKUsltc0.net]
g++更新にともない
自前ライブラリのビルドでエラーが出るようになって
悩んでたところを解説してくれてる
マジで凄い人達だな

295 名前:デフォルトの名無しさん (ワッチョイ a901-UvLK) [2023/06/21(水) 11:31:26.94 ID:IDPPhD2V0.net]
>メンバ関数内にひとつでも候補が見つかった時点で非メンバ関数は一切考慮に入らなくなる。
thx。確かにこれ経験したことあるわ・・・ややこしいし名前変えて対処したけど

296 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/21(水) 12:13:25.08 ID:3HBFHOpK0.net]
>>285 の例は using を使う形でも解決できる。 (設計意図によってはそれが妥当かどうかわからんけど。)

namespace ns {
struct foo {};

struct hoge {};
int operator+(const hoge& x, const hoge& y) { return 1; }
};

ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); }

namespace ns {
template <class T>
void bar(const T&) {
using ::operator+; // グローバルな operator+ をオーバーロード候補として参加させる
T() + T();
}
};

int main() { bar(ns::foo()); }


テンプレートを見る機会がよくあるなら std::begin を using している事例は見たことがあると思う。

297 名前:デフォルトの名無しさん (ワッチョイ ad10-fL0y) mailto:sage [2023/06/21(水) 12:20:53.22 ID:s1sJDdcu0.net]
C++って、こういう悪夢みたいなテクニックで溢れかえってるよなあ
RustやらPythonだのに人気が移るわけですよ

298 名前:デフォルトの名無しさん (テテンテンテン MM96-Axrn) mailto:sage [2023/06/21(水) 12:23:49.28 ID:xjKiS8Z6M.net]
記法でいうならNimがいいよ。

299 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/21(水) 16:00:35.62 ID:3HBFHOpK0.net]
カスタマイズされた関数が呼ばれるようにする綺麗な方法として customization point object という概念が近頃は導入されてる。
綺麗な方法というか汚い部分はライブラリに隠すってだけなんだけど。
真似してみてもいいかもね。

より綺麗な方法が導入されるのはいいんだけど、
過去の方法が消えてなくなるわけでもないし完全に置き換えられるわけでもないからなぁ。
個々には良くなっても全体としては余計に複雑になるだけってのもよくある話。
https://m.xkcd.com/927/



300 名前:デフォルトの名無しさん (ワッチョイ c997-trtU) mailto:sage [2023/06/22(木) 09:50:22.29 ID:+UOgHQ6A0.net]
max RSS (メモリ総量) の取得ってWindowsとLinuxでポータブルな方法ないの?

301 名前:デフォルトの名無しさん (スプッッ Sd12-9xvA) [2023/06/22(木) 10:07:05.02 ID:T+/An9G4d.net]
C++標準ライブラリには無い

外部ライブラリに頼るか自分で実装するかになるけど、結局のところ#ifdefでOS依存の機能を呼び分けるしかない

302 名前:デフォルトの名無しさん (ワッチョイ 196e-ljvc) mailto:sage [2023/06/22(木) 10:35:39.47 ID:myrOOi5M0.net]
std::uintptr_t get_available_memory();
とプロトタイプだけ用意して、定義を環境別に作るだな

内容的に割と単純な処理のはずで
環境別に用意といってもたいした工数にはなるめえよ

303 名前:デフォルトの名無しさん (アウアウウー Sacd-Hkv7) mailto:sage [2023/06/22(木) 17:54:50.46 ID:Sn58Ngpoa.net]
Nim いいよね
C++ 嫌になったら Nim においでおいで

304 名前:デフォルトの名無しさん (ワッチョイ c997-trtU) mailto:sage [2023/06/23(金) 06:00:18.48 ID:AFPisFIg0.net]
なんかのオブジェクトをポインタじゃなく実体として持ってるとして、それを delete するやり方ってないの?
たとえば std::vector A に対して
delete &A;
みたいな

305 名前:デフォルトの名無しさん (ワッチョイ 92ad-DGQF) mailto:sage [2023/06/23(金) 06:14:43.58 ID:Dz+tkRpF0.net]
「実体を持っている」と言うが「誰が」持っているかにもよる
グローバル変数として宣言しているなら予めメモリ上に確保されているから破棄は無理(強引に再利用はできる)
スコープ内で変数として宣言したのなら必要なメモリはスタック上にあるからスタックを弄るしかない
別のオブジェクトのメンバ変数として宣言されているならそのオブジェクトを破棄する

306 名前:デフォルトの名無しさん (ワッチョイ 92ad-DGQF) mailto:sage [2023/06/23(金) 06:17:44.59 ID:Dz+tkRpF0.net]
スコープ内でってのはローカル変数の意味で言ったの

307 名前:デフォルトの名無しさん (ワッチョイ 3602-Ul6j) [2023/06/23(金) 07:14:23.97 ID:GEB8UNzF0.net]
A.~vector<>();でいいんじゃないの?
メモリ解放が必要ならdelete(void*)&A;とかして。

308 名前:デフォルトの名無しさん (ワッチョイ 196e-ljvc) mailto:sage [2023/06/23(金) 07:18:45.05 ID:v++V1HM40.net]
>>299
deleteはdynamic storage durationのオブジェクトにのみ許される
std::vector<int> A;はautomatic storage durationの場合はその定義を囲むブレースから逸脱すれば破棄される
static storage durationの場合はプログラムの実行終了時に破棄される
thread storage durationの場合はスレッド終了時に破棄される

309 名前:デフォルトの名無しさん (テテンテンテン MM96-Axrn) mailto:sage [2023/06/23(金) 07:19:36.07 ID:pmKt7pYtM.net]
極論すれば、c++の変数は自動変数しか無いから、変数で定義しているものはコンパイラに任せるしか無い。



310 名前:デフォルトの名無しさん (ワッチョイ 196e-ljvc) mailto:sage [2023/06/23(金) 07:23:15.08 ID:v++V1HM40.net]
> c++の変数は自動変数しか無い

???

311 名前:デフォルトの名無しさん (ワッチョイ adc9-1tDD) mailto:sage [2023/06/23(金) 08:10:40.98 ID:Z0FiiE+w0.net]
変数の生命期間よりも前に絶つのは new したものを delete する方法しかないよ

std::vector* pA = new std::vector();
std::vector& A = *pA;
 :
 Aで操作
 :
delete pA;
この後 Aに対して操作すると鼻から悪魔

312 名前:デフォルトの名無しさん (ワッチョイ 196e-ljvc) mailto:sage [2023/06/23(金) 08:36:05.01 ID:v++V1HM40.net]
auto&& A { *new std::vector<int>(0) };
delete &A;
これで「実体」のように偽装はできるけど
こんなコード書くやついたらグーパンだよ

313 名前:デフォルトの名無しさん (ワッチョイ 92f0-L1I+) mailto:sage [2023/06/23(金) 08:38:29.90 ID:OoWAXDqh0.net]
このスレ読んでると目の裏がチカチカしてくるなw

314 名前:デフォルトの名無しさん (ワッチョイ f59c-Axrn) mailto:sage [2023/06/23(金) 08:46:52.36 ID:z+mnuoLR0.net]
>>305
極論すれば、と言っているだろ。
せめて反例ぐらい出せよ。

315 名前:デフォルトの名無しさん (ワッチョイ 196e-ljvc) mailto:sage [2023/06/23(金) 09:45:42.49 ID:v++V1HM40.net]
反例っておまえ・・・

静的変数

316 名前:デフォルトの名無しさん (ワッチョイ 0d4e-L1I+) mailto:sage [2023/06/23(金) 10:11:58.67 ID:Zb3L9Wmq0.net]
>>299
deleteで何をしたいかによるな
deleteは
・デストラクタを呼び出して
・メモリを開放する
という2つの動作が含まれるが、「メモリを開放する」に関しては、確保されてもいないメモリはもちろん開放できないが、
デストラクタは実体としてはただの関数なので、普通に呼び出すことは可能
ただし、メモリが開放される(deleteされる)時にもデストラクタはもちろん呼び出されるので、2重に呼び出しても大丈夫なように設計されたクラスである必要はある

317 名前:デフォルトの名無しさん (ワッチョイ 8101-1tDD) mailto:sage [2023/06/23(金) 11:56:54.20 ID:jOpqVfQE0.net]
>>299
スコープを終わらせれば消える

318 名前:デフォルトの名無しさん (テテンテンテン MM96-UmNC) mailto:sage [2023/06/23(金) 13:49:52.85 ID:RsoTpuHzM.net]
Windows11でc++の開発したいんですけど開発環境何を選べばいいですか?
ちなみに趣味でおもちゃ言語のコンパイラを書こうと思います

319 名前:デフォルトの名無しさん (スッップ Sdb2-Ul6j) [2023/06/23(金) 14:29:49.42 ID:P5Uu3Ce/d.net]
wslのclangでいいんじゃないの



320 名前:デフォルトの名無しさん (ワッチョイ 515f-C6j3) mailto:sage [2023/06/23(金) 14:40:39.89 ID:79pDbKtj0.net]
>>311
> 2重に呼び出しても大丈夫なように設計されたクラスである必要はある
trivial destructor 以外は(空の ~T() {} 含め)どうがんばっても大丈夫にはならず未定義動作となる模様。
https://timsong-cpp.github.io/cppwp/n4868/basic.life#9.sentence-1

321 名前:デフォルトの名無しさん (テテンテンテン MM96-UmNC) mailto:sage [2023/06/23(金) 14:42:57.84 ID:XaN8/xk5M.net]
>>314
visual studioでできませんか?
visual studioに依存しないような形で

322 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/23(金) 14:49:06.12 ID:Xemzxb7u0.net]
>>316
依存するかしないかはプログラマが気を付けることだろ

323 名前:デフォルトの名無しさん (ワッチョイ 196e-ljvc) mailto:sage [2023/06/23(金) 14:58:36.88 ID:v++V1HM40.net]
>>316
つーか俺はVisual Studioを推奨する
コンパイラ本体が昔からしっかりしてるし
デバッガは無数の信者を抱えるクオリティ

324 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/23(金) 15:11:25.32 ID:Xemzxb7u0.net]
俺はコンパイラは複数を利用するのが好ましいと思う。
気を付けてても処理系に依存している (または未定義を踏んでいる) こともある。
いくつかのコンパイラで試してみれば問題点を発見しやすい。

発現した問題についてはデバッガなりなんなりで追えばいいんだが、
問題が潜伏したまま表面に現れないってのは後になってじわじわ効いてきたりするし……。

325 名前:デフォルトの名無しさん (アウアウウー Sacd-Hkv7) mailto:sage [2023/06/23(金) 16:11:46.79 ID:lCxAQSJFa.net]
>>299
デストラクタに直接リソース解放させるより
リソース解放用の dispose() みたいな関数を造っておいて
デストラクタから dispose() 呼ぶのと同時に
delete しないで dispose() だけ外から呼ぶ設計もあるよ

326 名前:デフォルトの名無しさん (アウアウウー Sacd-Hkv7) mailto:sage [2023/06/23(金) 16:14:47.39 ID:lCxAQSJFa.net]
>>313
Code::Blocks (+ mingw)

327 名前:デフォルトの名無しさん (ワッチョイ 69f0-J7ro) mailto:sage [2023/06/23(金) 18:47:00.64 ID:5tcqgCxE0.net]
コンパイラの本なにがいいのかオススメ聞いたらオッサンに聞いたら怪獣が書いてある本って云われて本屋行って買ったらあとで付録のFDD誰かにかっぱわられていタコとに気付いたけどその本一冊ではなんの役にも立たないクソみたいな本だったわ
そのあとオライリーのyacc&lexの本と早乙女氏のBison&Flex本で学び直したわ

328 名前:デフォルトの名無しさん (ワッチョイ 69f0-J7ro) mailto:sage [2023/06/23(金) 19:05:06.07 ID:5tcqgCxE0.net]
良く見たら全然違ったわw
https://i.imgur.com/DHAPVXR.jpg
yacc&lexが早乙女氏でBison&Flexが五月女氏でオライリーに似てるけどASCII出版やったわ

329 名前:デフォルトの名無しさん (テテンテンテン MM96-Axrn) mailto:sage [2023/06/23(金) 19:51:54.58 ID:s3XGk2XtM.net]
>>316
まず動くものを作ることに注力したほうがいい。
どうせ最初のコードは(問題領域の学習後に)捨てることになるから、プロトタイプと割り切るべき。あんまり頑張ると進捗悪くて挫折するし、うまく行ってもコンコルド効果で酷い目にあう。

>>310
確かに静的変数は自動だけど別物だな……よくやった。悔しいが褒めてやろう。



330 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) mailto:sage [2023/06/23(金) 22:40:53.53 ID:Xemzxb7u0.net]
>>324
???
storage duration は四種類の内の「ひとつ」であることは直接的に明記されていて解釈の余地がない。
https://timsong-cpp.github.io/cppwp/n4861/basic.stc#1
兼ねる場合は存在しない。

331 名前:デフォルトの名無しさん (ワッチョイ 6501-2DXs) [2023/06/24(土) 08:29:33.32 ID:31MSzc3x0.net]
>まず動くものを作ることに注力したほうがいい。
+1票

>いくつかのコンパイラで試してみれば問題点を発見しやすい。
これはその通りだけど、もっともっと先の話






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

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

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