質問編集履歴
5
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
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
test
CHANGED
File without changes
|
test
CHANGED
@@ -72,7 +72,7 @@
|
|
72
72
|
|
73
73
|
```cpp
|
74
74
|
|
75
|
-
|
75
|
+
is_invocable_v<decltype(&cls::mem_fn), cls*>
|
76
76
|
|
77
77
|
```
|
78
78
|
|
2
test
CHANGED
File without changes
|
test
CHANGED
@@ -16,17 +16,17 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
int
|
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
|
-
でしたら、
|
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
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
|
+
(もしかして「特に定まっていない」で結論なのでは…)
|