[過去ログ]
C++相談室 part164 (1002レス)
C++相談室 part164 http://mevius.5ch.net/test/read.cgi/tech/1683600652/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
260: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/20(火) 10:05:39.77 ID:IIzrqfbq0 状況を簡略化するとこう。 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 の (というかそれに限らず既存のライブラリの) 宣言の順序をどうこうするわけにもいかないので無理にカスタムしようとするのは筋が悪いということになる。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/260
261: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 10:53:08.18 ID:vGfe0Eju0 >>260 >だから順序を変えれば通る。 最近手元のg++を更新しまして10.2.1 -> 12.2.0になったんですが 前者のケースが通らなくなりまして疑問に思っていたところでした 10.2.1は寛容で両方とも通るけどC++的には後者のみ通るのが正しい? http://mevius.5ch.net/test/read.cgi/tech/1683600652/261
285: デフォルトの名無しさん (ワッチョイ a901-UvLK) [] 2023/06/21(水) 04:29:46.61 ID:IDPPhD2V0 >>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<>()); } すでに名前空間内に同名の関数があった場合はダメっぽい http://mevius.5ch.net/test/read.cgi/tech/1683600652/285
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.038s