質問編集履歴
7
追記
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -219,5 +219,5 @@
|
|
|
219
219
|
|
|
220
220
|
> uniquely-named variable (here denoted by e)
|
|
221
221
|
|
|
222
|
-
とかいう謎の変数がその場で作られる(で,それがその場で get の引数になる)ことにより,引数が `&&` な `get` が必要になる,みたいな……?
|
|
222
|
+
とかいう謎の変数が( `v` のコピーとして)その場で作られる(で,それがその場で get の引数になる)ことにより,引数が `&&` な `get` が必要になる,みたいな……?
|
|
223
223
|
全く自信無いですが.
|
6
試したこと(2)を追記
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -169,3 +169,55 @@
|
|
|
169
169
|
template< std::size_t I, size_t Dim, typename Val_t >
|
|
170
170
|
struct std::tuple_element< I, const V<Dim,Val_t> >{ using type = const Val_t; };
|
|
171
171
|
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 試したこと(2)
|
|
176
|
+
|
|
177
|
+
とても私のような素人に読める文章ではないが,[ここ](https://en.cppreference.com/cpp/language/structured_binding) をなんとなく見た感じ……
|
|
178
|
+
ダメなのは tuple_element じゃなくて get の方なのかも.
|
|
179
|
+
|
|
180
|
+
```C++
|
|
181
|
+
auto [x,y] = v;
|
|
182
|
+
const auto [x,y] = v;
|
|
183
|
+
auto &[x,y] = v;
|
|
184
|
+
const auto &[x,y] = v;
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
のどれなのかによって用いられる get の引数の型が異なるんだけど,必要なやつを用意してなかったから問題が起きている……みたいな?
|
|
188
|
+
下記の (3)や(4) を追加するとコンパイルエラーが消えるようだ.
|
|
189
|
+
|
|
190
|
+
```C++
|
|
191
|
+
//(1)
|
|
192
|
+
// auto &[x,y] = v; で使われる
|
|
193
|
+
template< std::size_t I, size_t Dim, typename Val_t >
|
|
194
|
+
Val_t& get( V<Dim,Val_t>& v ) noexcept { return v[I]; }
|
|
195
|
+
|
|
196
|
+
//(2)
|
|
197
|
+
// const auto &[x,y] = v; で使われる
|
|
198
|
+
// ※(4)が無い場合には const auto [x,y] = v; でも使われる
|
|
199
|
+
template< std::size_t I, size_t Dim, typename Val_t >
|
|
200
|
+
const Val_t& get( const V<Dim,Val_t>& v ) noexcept { return v[I]; }
|
|
201
|
+
|
|
202
|
+
//---
|
|
203
|
+
//以下の (3),(4) を追加した
|
|
204
|
+
//(これらの戻り値の型がどうあるべきなのかがさっぱり謎だが……)
|
|
205
|
+
//---
|
|
206
|
+
|
|
207
|
+
//(3)
|
|
208
|
+
// auto [x,y] = v; で使われる
|
|
209
|
+
template< std::size_t I, size_t Dim, typename Val_t >
|
|
210
|
+
Val_t& get( V<Dim,Val_t>&& v ) noexcept { return v[I]; }
|
|
211
|
+
|
|
212
|
+
//(4)
|
|
213
|
+
// const auto [x,y] = v; で使われる
|
|
214
|
+
template< std::size_t I, size_t Dim, typename Val_t >
|
|
215
|
+
const Val_t& get( const V<Dim,Val_t>&& v ) noexcept { return v[I]; }
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
イマイチ話がわかりませんが, `&` 無しの形の `auto [x,y] = v;` や `const auto [x,y] = v;` だと,
|
|
219
|
+
|
|
220
|
+
> uniquely-named variable (here denoted by e)
|
|
221
|
+
|
|
222
|
+
とかいう謎の変数がその場で作られる(で,それがその場で get の引数になる)ことにより,引数が `&&` な `get` が必要になる,みたいな……?
|
|
223
|
+
全く自信無いですが.
|
5
追記
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -159,7 +159,7 @@
|
|
|
159
159
|
## 試したこと
|
|
160
160
|
|
|
161
161
|
エラーメッセージの雰囲気から,
|
|
162
|
-
「 `const double` の初期化に `double &` を用いようとしている」みたいな話かと見えるので,
|
|
162
|
+
「 `const double` の初期化に `double &` を用いようとしている」みたいな話かと見える(? だとしても何が問題なのか謎だが…)ので,
|
|
163
163
|
以下のようなものを追加してみたのですが,全くエラーメッセージも変わりませんでした.
|
|
164
164
|
|
|
165
165
|
```C++
|
4
タグ追加
title
CHANGED
|
File without changes
|
body
CHANGED
|
File without changes
|
3
コード全体を追加
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -90,6 +90,70 @@
|
|
|
90
90
|
1. 何故エラーになっているのでしょうか?
|
|
91
91
|
2. どう直せば良いのでしょうか?
|
|
92
92
|
|
|
93
|
+
(追記)コード全体:
|
|
94
|
+
|
|
95
|
+
```C++
|
|
96
|
+
#include <iostream>
|
|
97
|
+
#include <tuple>
|
|
98
|
+
|
|
99
|
+
template< size_t Dim, typename Val_t >
|
|
100
|
+
class V
|
|
101
|
+
{
|
|
102
|
+
public:
|
|
103
|
+
Val_t Components[Dim];
|
|
104
|
+
|
|
105
|
+
Val_t &operator[](size_t i){ return Components[i]; }
|
|
106
|
+
const Val_t &operator[](size_t i) const { return Components[i]; }
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
template< size_t Dim, typename Val_t >
|
|
110
|
+
struct std::tuple_size< V<Dim,Val_t> >{ static constexpr size_t value = Dim; };
|
|
111
|
+
|
|
112
|
+
template< std::size_t I, size_t Dim, typename Val_t >
|
|
113
|
+
struct std::tuple_element< I, V<Dim,Val_t> >{ using type = Val_t; };
|
|
114
|
+
|
|
115
|
+
template< std::size_t I, size_t Dim, typename Val_t >
|
|
116
|
+
struct std::tuple_element< I, const V<Dim,Val_t> >{ using type = const Val_t; };
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
template< std::size_t I, size_t Dim, typename Val_t >
|
|
120
|
+
Val_t& get( V<Dim,Val_t>& v ) noexcept { return v[I]; }
|
|
121
|
+
|
|
122
|
+
template< std::size_t I, size_t Dim, typename Val_t >
|
|
123
|
+
const Val_t& get( const V<Dim,Val_t>& v ) noexcept { return v[I]; }
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
//Test
|
|
127
|
+
int main()
|
|
128
|
+
{
|
|
129
|
+
V<2,double> v{ 5.2, 9.999 };
|
|
130
|
+
get<0>( v ) = 7;
|
|
131
|
+
get<1>( v ) = -6.252;
|
|
132
|
+
std::cout << get<0>(v) << " , " << get<1>(v) << std::endl;
|
|
133
|
+
|
|
134
|
+
#if 1
|
|
135
|
+
//E0433
|
|
136
|
+
// 型 "std::tuple_element<0Ui64, V<2Ui64, double>>::type &" (aka "double &") の参照を
|
|
137
|
+
// 型 "const double" の初期化子にバインドするときに修飾子がドロップされました
|
|
138
|
+
//C2440
|
|
139
|
+
// '初期化中': 'const Val_t' から 'Val_t &' に変換できません。
|
|
140
|
+
{
|
|
141
|
+
auto [x,y] = v;
|
|
142
|
+
std::cout << x << " , " << y << std::endl;
|
|
143
|
+
}
|
|
144
|
+
#endif
|
|
145
|
+
|
|
146
|
+
{
|
|
147
|
+
//こっちはOK
|
|
148
|
+
auto &[x,y] = v;
|
|
149
|
+
std::cout << x << " , " << y << std::endl;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
std::cout << "(END)" << std::endl;
|
|
153
|
+
return 0;
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
93
157
|
---
|
|
94
158
|
|
|
95
159
|
## 試したこと
|
2
追記
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -90,3 +90,18 @@
|
|
|
90
90
|
1. 何故エラーになっているのでしょうか?
|
|
91
91
|
2. どう直せば良いのでしょうか?
|
|
92
92
|
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 試したこと
|
|
96
|
+
|
|
97
|
+
エラーメッセージの雰囲気から,
|
|
98
|
+
「 `const double` の初期化に `double &` を用いようとしている」みたいな話かと見えるので,
|
|
99
|
+
以下のようなものを追加してみたのですが,全くエラーメッセージも変わりませんでした.
|
|
100
|
+
|
|
101
|
+
```C++
|
|
102
|
+
//tuple_element の const 版が必要ということだろうか?
|
|
103
|
+
//……しかしそれをどう書けばいいのか?
|
|
104
|
+
//これだとダメっぽい.
|
|
105
|
+
template< std::size_t I, size_t Dim, typename Val_t >
|
|
106
|
+
struct std::tuple_element< I, const V<Dim,Val_t> >{ using type = const Val_t; };
|
|
107
|
+
```
|
1
抜け字修正
title
CHANGED
|
File without changes
|
body
CHANGED
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
struct std::tuple_element< I, V<Dim,Val_t> >{ using type = Val_t; };
|
|
43
43
|
|
|
44
44
|
//get
|
|
45
|
-
/(こっちもとりあえず I が範囲外という場合を考えていません)
|
|
45
|
+
//(こっちもとりあえず I が範囲外という場合を考えていません)
|
|
46
46
|
template< std::size_t I, size_t Dim, typename Val_t >
|
|
47
47
|
Val_t& get( V<Dim,Val_t>& v ) noexcept { return v[I]; }
|
|
48
48
|
|