回答編集履歴

5

fix typo

2019/01/15 08:39

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -96,7 +96,7 @@
96
96
 
97
97
  ----
98
98
 
99
- おまけ: 実は質問のケースでは、下記コードのようにプロトタイプ宣言型と実引数の型を厳密位置させると、期待通りWinSockの `bind` が呼び出されるようになります。しかし、この解決方法はあまりにC++言語の難解なルールに依存しているため、素直に名前空間を分けて扱うことをおススメします。
99
+ おまけ: 実は質問のケースでは、下記コードのようにプロトタイプ宣言型と実引数の型を厳密一致させると、期待通りWinSockの `bind` が呼び出されるようになります。しかし、この解決方法はあまりにC++言語の難解なルールに依存しているため、素直に名前空間を分けて扱うことをおススメします。
100
100
 
101
101
 
102
102
 

4

update

2019/01/15 08:39

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
File without changes

3

update

2019/01/15 08:09

投稿

yohhoy
yohhoy

スコア6191

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

2019/01/15 08:09

投稿

yohhoy
yohhoy

スコア6191

test CHANGED
@@ -80,7 +80,7 @@
80
80
 
81
81
 
82
82
 
83
- 一方、C++標準ライブラリ `std::bind` 関数テンプレートでは実引数から全てのパラメータ型を推論するため、第1引数型`F`==`int`, 第2引数型以降`BoundArgs...`=={`struct sockaddr *`, `int`}と推論されます[※]。つまり、全ての実引数に関数パラメータが完全一致する関数が(意図せず)生み出されます。
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となっているため、テンプレートパラメータ`F`==`int&`に型推論されます。
91
+ ※注:厳密にはForwarding Referenceため、テンプレートパラメータ`F`==`int&`、第1引数型は`int&`に型推論されます。また可変テンプレートパラメータ`BoundArgs`=={`struct sockaddr *`, `int`}となり、第2,3引数型はそれぞれ`struct sockaddr *&&`, `int&&`に型推論されます。
92
92
 
93
93
 
94
94
 

1

refinement

2019/01/15 08:07

投稿

yohhoy
yohhoy

スコア6191

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
- status = bind((SOCKET)recvSocket, (const struct sockaddr *)&recvSockAddr, (int)sizeof(recvSockAddr));
109
+ (const struct sockaddr *) &recvSockAddr,
110
+
111
+ (int) sizeof(recvSockAddr));
108
112
 
109
113
  ```