int main() {
int y;
int x{ y = 5 };
//x is 5
}
y = 5は計算可能な式ではないので、これはどのように可能ですか?
また、コンパイラまたはIDEがmain()がintを返さないことについて不平を言わないのはなぜですか?
y = 5
ここでなぜ5 になるのかという質問を再定義する必要があります。代入演算子が何かを返す可能性は、確かにC / C ++の奇妙な機能です。
int main() {
int y;
int x{ y = 5 };
//x is 5
}
y = 5は計算可能な式ではないので、これはどのように可能ですか?
また、コンパイラまたはIDEがmain()がintを返さないことについて不平を言わないのはなぜですか?
y = 5
ここでなぜ5 になるのかという質問を再定義する必要があります。代入演算子が何かを返す可能性は、確かにC / C ++の奇妙な機能です。
回答:
最後の質問から始めます
また、コンパイラまたはIDEがmain()がintを返さないことについて不平を言わないのはなぜですか?
C ++標準に準拠(6.6.1メイン関数)
5 mainのreturnステートメントには、main関数を終了し(自動ストレージ期間を持つオブジェクトを破棄)、戻り値を引数としてstd :: exitを呼び出す効果があります。制御がmainの複合ステートメントの終わりから流れ出る場合、その効果はオペランド0の戻りと同じです(18.3も参照)。
そしてこの質問に関連して
y = 5は計算可能な式ではないので、これはどのように可能ですか?
C ++標準から(8.18代入演算子と複合代入演算子)
1代入演算子(=)と複合代入演算子はすべて右から左にグループ化されます。すべての左オペランドとして変更可能な左辺値が必要であり、左オペランドを参照する左辺値を返します。
この宣言をSp
int x{ y = 5 };
同等に2つのステートメントに分割できます
y = 5;
int x{ y };
さらに、C ++では、変数yへの参照を次のようにすることもできます。
int &x{ y = 5 };
ここにデモプログラムがあります
#include <iostream>
int main()
{
int y;
int &x{ y = 5 };
std::cout << "y = " << y << '\n';
x = 10;
std::cout << "y = " << y << '\n';
}
その出力は
y = 5
y = 10
あなたはこの宣言をするかもしれません
int x{ y = 5 };
同様に書き直し
int x = { y = 5 };
ただし、これらの(上記の宣言と同様に見える)2つの宣言には違いがあることを考慮してください。
auto x{ y = 5 };
そして
auto x = { y = 5 };
最初の宣言では、変数x
のタイプはint
です。2番目の宣言では、変数x
のタイプはstd::initializer_list<int>
です。
違いをわかりやすくするには、オブジェクトの値がどのように出力されるかを確認してください。
#include <iostream>
int main()
{
int y;
auto x1 { y = 5 };
std::cout << "x1 = " << x1 << '\n';
auto x2 = { y = 10 };
std::cout << "*x2.begin()= " << *x2.begin() << '\n';
std::cout << "y = " << y << '\n';
return 0;
}
プログラム出力は
x1 = 5
*x2.begin()= 10
y = 10
y = 5は計算可能な式ではないので、これはどのように可能ですか?
これは代入であり、代入により値、つまり「左オペランドのcv非修飾型」が生成されます。[expr.ass / 3]を参照してください。したがって、y = 5
結果はy
、つまり、5
初期化に使用されますx
。
2番目の質問については、メイン(または[basic.start.main / 5])のcppreferenceを参照してください。
main関数の本文には
return
ステートメントを含める必要はありません。制御がreturn
ステートメントに出会わずにmainの終わりに達した場合、結果はを実行したことになりreturn 0;
ます。
したがって、コンパイラまたはIDE return
が最後にステートメントがないことを警告するのは、main
明らかに間違っています。確かに、常にreturn
非void
関数のexecptmain
からオブジェクトを拒否する必要があるという事実は一種の...まあ、歴史的な理由から私は推測しています。
return
です。-pedantic
cppreferenceのドキュメントを見ると、operator=()
割り当てられたオブジェクトへの参照を返すことがわかります。したがって、割り当ては、割り当てられたオブジェクトを返す式として使用できます。
次に、中かっこを使用した通常の割り当てです。
y = 5
は式であり、valueを持っています5
。なぜそうではないと思いますか?