質問編集履歴

5

2017/08/17 14:49

投稿

reverse
reverse

スコア12

test CHANGED
File without changes
test CHANGED
@@ -86,7 +86,11 @@
86
86
 
87
87
 
88
88
 
89
- したがって、凡そどの型でも構わないようであれば、「仕様」として特に定まっていないのだろうかと疑問に思った次第です。
89
+ したがって、凡そどの型でも構わないようであれば、与えられるべき型の「仕様」特に定まっていないのだろうかと疑問に思った次第です。
90
+
91
+
92
+
93
+ ニュアンスは伝わりましたでしょうか?
90
94
 
91
95
 
92
96
 

4

2017/08/17 14:49

投稿

reverse
reverse

スコア12

test CHANGED
File without changes
test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
 
44
44
 
45
- > yohhoy
45
+ > yohhoy
46
46
 
47
47
  > 「仕様的に良い」「仕様として理想的」は、どのようなニュアンス・観点を指していますか?
48
48
 

3

2017/08/17 14:32

投稿

reverse
reverse

スコア12

test CHANGED
File without changes
test CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
  ```cpp
74
74
 
75
- std::is_invocable_v<decltype(&cls::mem_fn), cls*>
75
+ is_invocable_v<decltype(&cls::mem_fn), cls*>
76
76
 
77
77
  ```
78
78
 

2

2017/08/17 14:29

投稿

reverse
reverse

スコア12

test CHANGED
File without changes
test CHANGED
@@ -16,17 +16,17 @@
16
16
 
17
17
 
18
18
 
19
- int main() {
19
+ static_assert(std::is_invocable_v<decltype(&cls::mem_fn), /* cls, cls&, cls*, etc. */>);
20
20
 
21
- static_assert(std::is_invocable_v<decltype(&cls::mem_fn), /* cls, cls&, cls*, etc. */>);
22
21
 
22
+
23
- }
23
+ int main() {}
24
24
 
25
25
  ```
26
26
 
27
27
 
28
28
 
29
- libstdc++のソースを読んだ限り、const修飾子の有無(const修飾されたメンバ関数の場合)、参照の有無、ポインタの有無で挙動は変わらないようなので、どの型がメンバポインタをとるときの仕様として理想的なのか分かりかねています。
29
+ libstdc++のソースを読んだ限り、`const`修飾子の有無(`const`修飾されたメンバ関数の場合)、参照の有無、ポインタの有無で挙動は変わらないようなので、どの型がメンバポインタをとるときの仕様として理想的なのか分かりかねています。
30
30
 
31
31
 
32
32
 
@@ -52,7 +52,7 @@
52
52
 
53
53
 
54
54
 
55
- まず、クラスメンバを呼び出す際、メンバ関数(あるいはメンバ変数も)の隠し引数としてオブジェクトのアドレスが渡される(これがthisポインタとして扱われる)と、一般に理解されていると思います。
55
+ まず、クラスメンバを呼び出す際、メンバ関数(あるいはメンバ変数も)の隠し引数としてオブジェクトのアドレスが渡される(これが`this`ポインタとして扱われる)と、一般に理解されていると思います。
56
56
 
57
57
 
58
58
 
@@ -66,11 +66,23 @@
66
66
 
67
67
 
68
68
 
69
- でしたら、`std::is_invocable_v<decltype(&cls::mem_fn), cls*>`という形が想定されるべき「仕様」なのではと考えました。
69
+ でしたら、
70
70
 
71
71
 
72
72
 
73
+ ```cpp
74
+
75
+ std::is_invocable_v<decltype(&cls::mem_fn), cls*>
76
+
77
+ ```
78
+
79
+
80
+
81
+ という形が想定されるべき「仕様」なのではと考えました。
82
+
83
+
84
+
73
- ところが実際は、`cls*`は内部的に`->*`演算子を使ってチェックする特殊化がなされ、`cls`や`cls&`などは内部的にconst修飾子や参照が取り除かれたの上で`.*`演算子を使ってチェックする特殊化がなされているようなので、結果に違いがありませんでした。
85
+ ところが実際は、`cls*`は内部的に`->*`演算子を使ってチェックする特殊化がなされ、`cls`や`cls&`などは内部的に`const`修飾子や参照が取り除かれたの上で`.*`演算子を使ってチェックする特殊化がなされているようなので、結果に違いがありませんでした。
74
86
 
75
87
 
76
88
 

1

2017/08/17 14:26

投稿

reverse
reverse

スコア12

test CHANGED
File without changes
test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  int main() {
20
20
 
21
- static_assert(std::is_invocable_v<decltype(&cls::mem_fn), /* cls, cls&, etc. */>);
21
+ static_assert(std::is_invocable_v<decltype(&cls::mem_fn), /* cls, cls&, cls*, etc. */>);
22
22
 
23
23
  }
24
24
 
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- libstdc++のソースを読んだ限り、const修飾子の有無(const修飾されたメンバ関数の場合)、参照の有無、ポインタの有無で挙動は変わらないようなので、どの型がメンバポインタの仕様として理想的なのか分かりかねています。
29
+ libstdc++のソースを読んだ限り、const修飾子の有無(const修飾されたメンバ関数の場合)、参照の有無、ポインタの有無で挙動は変わらないようなので、どの型がメンバポインタをとるときの仕様として理想的なのか分かりかねています。
30
30
 
31
31
 
32
32
 
@@ -35,3 +35,47 @@
35
35
 
36
36
 
37
37
  回答よろしくお願いします。
38
+
39
+
40
+
41
+ ## 追記
42
+
43
+
44
+
45
+ > yohhoy
46
+
47
+ > 「仕様的に良い」「仕様として理想的」は、どのようなニュアンス・観点を指していますか?
48
+
49
+
50
+
51
+ 言葉が足らず申し訳ないです。
52
+
53
+
54
+
55
+ まず、クラスメンバを呼び出す際、メンバ関数(あるいはメンバ変数も)の隠し引数としてオブジェクトのアドレスが渡される(これがthisポインタとして扱われる)と、一般に理解されていると思います。
56
+
57
+
58
+
59
+ ```cpp
60
+
61
+ cls c;
62
+
63
+ c.mem_fn(); // -> mem_fn(&c);
64
+
65
+ ```
66
+
67
+
68
+
69
+ でしたら、`std::is_invocable_v<decltype(&cls::mem_fn), cls*>`という形が想定されるべき「仕様」なのではと考えました。
70
+
71
+
72
+
73
+ ところが実際は、`cls*`は内部的に`->*`演算子を使ってチェックする特殊化がなされ、`cls`や`cls&`などは内部的にconst修飾子や参照が取り除かれたの上で`.*`演算子を使ってチェックする特殊化がなされているようなので、結果に違いがありませんでした。
74
+
75
+
76
+
77
+ したがって、凡そどの型でも構わないようであれば、「仕様」として特に定まっていないのだろうかと疑問に思った次第です。
78
+
79
+
80
+
81
+ (もしかして「特に定まっていない」で結論なのでは…)