質問するログイン新規登録

質問編集履歴

7

追記

2026/09/16 10:41

投稿

fana
fana

スコア12498

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)を追記

2026/09/16 10:38

投稿

fana
fana

スコア12498

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

追記

2026/09/16 09:10

投稿

fana
fana

スコア12498

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

タグ追加

2026/09/16 09:04

投稿

fana
fana

スコア12498

title CHANGED
File without changes
body CHANGED
File without changes

3

コード全体を追加

2026/09/16 08:59

投稿

fana
fana

スコア12498

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

追記

2026/09/16 08:55

投稿

fana
fana

スコア12498

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

抜け字修正

2026/09/16 08:46

投稿

fana
fana

スコア12498

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