回答編集履歴
5
fix typo
test
CHANGED
@@ -96,7 +96,7 @@
|
|
96
96
|
|
97
97
|
----
|
98
98
|
|
99
|
-
おまけ: 実は質問のケースでは、下記コードのようにプロトタイプ宣言型と実引数の型を厳密
|
99
|
+
おまけ: 実は質問のケースでは、下記コードのようにプロトタイプ宣言型と実引数の型を厳密一致させると、期待通りWinSockの `bind` が呼び出されるようになります。しかし、この解決方法はあまりにC++言語の難解なルールに依存しているため、素直に名前空間を分けて扱うことをおススメします。
|
100
100
|
|
101
101
|
|
102
102
|
|
4
update
test
CHANGED
File without changes
|
3
update
test
CHANGED
@@ -111,3 +111,5 @@
|
|
111
111
|
(int) sizeof(recvSockAddr));
|
112
112
|
|
113
113
|
```
|
114
|
+
|
115
|
+
Demo: [https://www.godbolt.ms/z/NiUAlN](https://www.godbolt.ms/z/NiUAlN)
|
2
refinement
test
CHANGED
@@ -80,7 +80,7 @@
|
|
80
80
|
|
81
81
|
|
82
82
|
|
83
|
-
一方、C++標準ライブラリ `std::bind` 関数テンプレートでは実引数から全てのパラメータ型を推論するため、第1引数型`F`==`int`, 第2引数型以降`BoundArgs
|
83
|
+
一方、C++標準ライブラリ `std::bind` 関数テンプレートでは実引数から全てのパラメータ型を推論するため、第1引数型`F`==`int`, 第2引数型以降`BoundArgs`=={`struct sockaddr *`, `int`}と推論されます[※]。つまり、全ての実引数型に関数パラメータ型が完全一致する関数が(意図せず)生み出されます。
|
84
84
|
|
85
85
|
|
86
86
|
|
@@ -88,7 +88,7 @@
|
|
88
88
|
|
89
89
|
|
90
90
|
|
91
|
-
※注:厳密にはForwarding Reference
|
91
|
+
※注:厳密にはForwarding Referenceのため、テンプレートパラメータ`F`==`int&`、第1引数型は`int&`に型推論されます。また可変テンプレートパラメータ`BoundArgs`=={`struct sockaddr *`, `int`}となり、第2,3引数型はそれぞれ`struct sockaddr *&&`, `int&&`に型推論されます。
|
92
92
|
|
93
93
|
|
94
94
|
|
1
refinement
test
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
|
43
43
|
|
44
44
|
|
45
|
-
説明のため、`bind` 関数呼出し元コードのエッセンスだけ抽出します。ここでは、実引数に指定する第1引数型(`int`)および第2引数型(struct sockaddr *)が、WinSock `bind` 関数プロトタイプ宣言の第1引数型(`SOCKET`==`unsigned __int64`)および第2引数型(`const struct sockaddr *`)とは **厳密一致していない** ことに着目してください。
|
45
|
+
説明のため、`bind` 関数呼出し元コードのエッセンスだけ抽出します。ここでは、実引数に指定する第1引数型(`int`)および第2引数型(`struct sockaddr *`)が、WinSock `bind` 関数プロトタイプ宣言の第1引数型(`SOCKET`==`unsigned __int64`)および第2引数型(`const struct sockaddr *`)とは **厳密一致していない** ことに着目してください。
|
46
46
|
|
47
47
|
```cpp
|
48
48
|
|
@@ -88,7 +88,7 @@
|
|
88
88
|
|
89
89
|
|
90
90
|
|
91
|
-
※注:厳密にはForwaring Referenceとなっているため、テンプレートパラメータ`F`==`int&`に型推論されます。
|
91
|
+
※注:厳密にはForwarding Referenceとなっているため、テンプレートパラメータ`F`==`int&`に型推論されます。
|
92
92
|
|
93
93
|
|
94
94
|
|
@@ -102,8 +102,12 @@
|
|
102
102
|
|
103
103
|
```cpp
|
104
104
|
|
105
|
-
// OK: キャストにより全ての引数型を厳密一致させる
|
105
|
+
// OK: 明示的なキャストにより全ての引数型を厳密一致させる
|
106
106
|
|
107
|
+
status = bind((SOCKET) recvSocket,
|
108
|
+
|
107
|
-
|
109
|
+
(const struct sockaddr *) &recvSockAddr,
|
110
|
+
|
111
|
+
(int) sizeof(recvSockAddr));
|
108
112
|
|
109
113
|
```
|