C++初心者です!
「構造化束縛」というのを使ってみようとしているのですが,下記コードの(2)がコンパイルエラーになってしまい,困っています.
A
が const だと,a
, b
も const になってしまうように見えますが,「構造化束縛」とはそういうものなのでしょうか?
そうである場合, const である A
に対して a
, b
が非 const な形にする術はないのでしょうか?
C++
1int main() 2{ 3 //何かデータがあって… 4 const int A[] = { 10, 20 }; 5 6 {//(1) 7 //データの現在の内容を得てそこから計算していきたい 8 auto a = A[0]; 9 auto b = A[1]; 10 //何か計算していく.ごく普通の話だと思う. 11 a += 5; 12 b *= 10; 13 } 14 15 {//(2) 上記(1)と同じことをやろうとしているつもりだが… 16 auto [a,b] = A; //データの現在の内容を得て 17 //そこから計算していきたいのだけど 18 //:コンパイルエラー.原因は「a,b は const だから」とのこと. 19 a += 5; 20 b *= 10; 21 } 22 return 0; 23}
[追記]
念のため,試している環境を示しておきます.
- (貧乏故,非常に古いPCの上で)Visual Studio 2017 を使用しています.プロジェクトのプロパティで「C++ 言語標準」という選択肢を「ISO C++17標準(/std:c++17)」にしてします.
- 上記環境が悪いのか? と思い,paiza.io というサイトでもやってみましたが結果は同じでした.(なお,こちらのサイトでは言語選択肢が「C++」となっていて,C++のどの版として実行されているのかはわかりませんでした)
(その後,Visual Studio 2019 も試したところ, どうにも Visual Studio 2017 だけ挙動が異なるようであった → 自己回答の形で記述)
[追記]
今 ココ を読んでいます.
私には非常に読みづらく,解釈に難儀していますが,この質問の例(配列)については以下のような話なのでしょうか?
"Case 1: binding an array" のところに,
Note that if the array type E is cv-qualified, so is its element type.
という記述があり,コレが関係しているように思えます.
(「E が const なら要素も const になるぞ」という話かと)
↓
ここの type E
とは何か? というのは,ちょっと上の方で
We use E to denote the type of the expression e.
とのことです. e
の型である,と.
↓
そしたら expression e
とは何か? というと,もうちょっと上の方で
A structured binding declaration first introduces a uniquely-named variable (here denoted by e) to hold the value of the initializer, as follows:
・ If expression has array type A and no ref-qualifier is present, then e has type cv A, where cv is the cv-qualifiers in the cv-auto sequence, and each element of e is copy- (for (1)) or direct- (for (2,3)) initialized from the corresponding element of expression.
とのことで,今は配列の場合であって,且つ私の書き方は
attr(optional) cv-auto ref-qualifier(optional) [ identifier-list ] = expression ; (1)
に相当すると思うので,
e
とは,私の配列の要素のコピーを持っている配列変数なのであって,この e
の型とは cv A
だそうです.
cv-auto sequence
というところに cv
なるものを私は特に書いていないと思うので,つまり e
の型たる E
とはここでいうところの array type A
かと.
↓
で,この array type A
というのが,私の例では const int[2]
だということ( int[2]
ではなくて)…なのかと読みました.
合っていますか?
回答3件
あなたの回答
tips
プレビュー