[過去ログ] C++相談室 part164 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
248
(1): (ワッチョイ 8101-1tDD) 2023/06/19(月)00:52 ID:Q4g6N6uX0(1/3) AAS
>>247
std::accumlateが定義されているnumericをincludeする前に
以下のようにグローバルスコープにプロトタイプを置いても
同じようにoperator+が見えてないとエラーが出ます
using Vector = std::array <double, 3>;
Vector operator + (const Vector &lhs, const Vector &rhs);
#include <numeric>
249
(1): (ワッチョイ a901-UvLK) 2023/06/19(月)03:40 ID:RYn53SnN0(1/2) AAS
accumlateは関数テンプレートだから実体化される時点でoperator+が見えてりゃOKのはず
言われてる通りADLで対象外なのが問題
250
(1): (ワッチョイ 256b-trtU) 2023/06/19(月)05:38 ID:JAsvvATP0(1) AAS
>>237
(スマート)ポインタで持って要らなくなったら明示的にリリースする方法はあらゆるコンテナに対して使えるよね?笑
251
(1): (ワッチョイ f59c-Axrn) 2023/06/19(月)08:48 ID:KLBRX38t0(1) AAS
>>250
>>223
252: (ワッチョイ 8101-1tDD) 2023/06/19(月)09:20 ID:Q4g6N6uX0(2/3) AAS
>>249
有難うございます
グローバルスコープに定義した関数が見えないのは
どうしてなんでしょうかね?
それでは全然グローバルじゃないような気がするのですが
規格を決めるときに何か意図があったのでしょうかね?
253
(1): (ワッチョイ a901-UvLK) 2023/06/19(月)10:39 ID:RYn53SnN0(2/2) AAS
そもそもが名前空間内(よその演算子と混ざらないように)にある演算子オーバーロードを、外部からでも引数が合えば使えるように(std::operator+(a, b)とか書かないでいいように)するためのルールらしいから
外部の演算子見に行くのは目的に合わんのじゃね

std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、あまりよろしくないやり方しようとしてると考えた方がいい
(だから>>246のように書いた、継承したら一応arrayではなくちゃんとVectorクラスに対する演算子だから通る)
254: (ワッチョイ 8101-1tDD) 2023/06/19(月)11:53 ID:Q4g6N6uX0(3/3) AAS
>>253
>std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、
>あまりよろしくないやり方しようとしてると考えた方がいい
なるほど
たぶんこういう考え方なんでしょうね
255: (ワッチョイ 5efb-+wmN) 2023/06/19(月)12:20 ID:4PINPeBN0(1) AAS
つまりvector<int>を使いなさいということ
256: (ワッチョイ 7d9b-trtU) 2023/06/19(月)12:21 ID:wGtx/iKL0(1) AAS
>>251
安価ミス
257: (アウアウウー Sacd-9XmN) 2023/06/20(火)00:04 ID:YSi65ASja(1) AAS
実引数依存の名前探索、Argument-Dependent Lookup (ADL)は、
Koenig lookup とも言う

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

ADLを知っているなら、かなりのプロと言える
258: (ワッチョイ 8101-1tDD) 2023/06/20(火)00:18 ID:vGfe0Eju0(1/7) AAS
勉強になります
259: (アウアウウー Sacd-9XmN) 2023/06/20(火)02:12 ID:1vctBLGTa(1) AAS
演算子のオーバーロードなら、フレンド関数とか?

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

外部リンク[html]:programming-place.net
260
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/20(火)10:05 ID:IIzrqfbq0(1/5) AAS
状況を簡略化するとこう。

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 は「通常の探索に加えて」関連する名前空間も探索対象にするルールなのでグローバル名前空間も探索対象になるが、通常の探索では後ろで宣言 (定義) されているものは見つけることができない。 この場合はエラーとして検出されるけど、可視な宣言と実際の定義の集合に食い違いは未定義という解釈でいいと思う。 (ちょっと自信はない……。)
省12
261
(1): (ワッチョイ 8101-1tDD) 2023/06/20(火)10:53 ID:vGfe0Eju0(2/7) AAS
>>260
>だから順序を変えれば通る。
最近手元のg++を更新しまして10.2.1 -> 12.2.0になったんですが
前者のケースが通らなくなりまして疑問に思っていたところでした
10.2.1は寛容で両方とも通るけどC++的には後者のみ通るのが正しい?
262: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/20(火)11:41 ID:IIzrqfbq0(2/5) AAS
>>261
前者はたぶん未定義かつ診断不要な状況なのでエラーを検出せずに通すのも正しい挙動で
プログラマがそういう状況を作ってしまうのが仕様に反する (というか結果が保証されない) という解釈になると思う。
263: (ワッチョイ 8101-1tDD) 2023/06/20(火)13:36 ID:vGfe0Eju0(3/7) AAS
なるほどー
有難うございます
264
(2): (JP 0H91-FhUT) 2023/06/20(火)21:39 ID:Pk8V/jejH(1/4) AAS
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をコンパイル時に呼び分けたいんですけど
省1
265: (ワッチョイ 515f-9XmN) 2023/06/20(火)22:18 ID:Cuq1USIJ0(1) AAS
is_invocableでおk
266
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) 2023/06/20(火)22:21 ID:IIzrqfbq0(3/5) AAS
>>264
渡されたコールバック関数の引数の数によって区別するってこと?
素朴な方法だとオーバーロードするのが手っ取り早いと思う。

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

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

void f1(int) {}
省5
267: (ワッチョイ 8101-1tDD) 2023/06/20(火)22:27 ID:vGfe0Eju0(4/7) AAS
>>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
}
省3
1-
あと 735 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 1.501s*