[解決済み] なぜC++では変数を宣言するときに変数名を括弧で囲むことができるのですか?
2023-05-10 13:18:38
疑問点
例えばこんな宣言があります。
int (x) = 0;
あるいはそれすらも
int (((x))) = 0;
私がこれを偶然見つけたのは、私のコードの中に、たまたま次のような断片があったためです。
struct B
{
};
struct C
{
C (B *) {}
void f () {};
};
int main()
{
B *y;
C (y);
}
明らかに、私はオブジェクト
C
を構築し、そのデストラクタで何か役に立つことをしたかったのです。しかし、コンパイラは
C (y);
を変数の宣言として扱います。
y
という型を持つ
C
というエラーが表示され、そのため
y
の再定義に関するエラーを表示します。面白いのは、もし私がこれを
C (y).f ()
のように書くか
C (static_cast<B*> (y))
のようにすると、意図したとおりにコンパイルされます。現代的な回避策としては
{}
を使うことです。
で、その後にわかったことですが、変数の宣言に
int (x) = 0;
とか、あるいは
int (((x))) = 0;
でも、実際にこのような宣言を使用している人を見たことがありません。今のところ、悪名高い "most vexing parse" に似たケースを作成するだけで、何も有用なものを追加しないことがわかりますので、私は興味があります。
どのように解決するのですか?
グループ化する。
具体的な例として、次のような関数型の変数を宣言することを考えてみましょう。
int f(int);
さて、このようなものへのポインタはどのように宣言するのでしょうか?
int *f(int);
いや、うまくいかない! これは、以下のような関数を返すと解釈されます。
int*
. 正しい方法でパースするためには、括弧を追加する必要があります。
int (*f)(int);
配列と同じ扱いです。
int *x[5]; // array of five int*
int (*x)[5]; // pointer to array of five int
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] mutable' キーワードには、const 関数で変数を変更できるようにする以外の目的があるのでしょうか?
-
[解決済み] C++の規格では、初期化されていないboolがプログラムをクラッシュさせることは可能ですか?
-
[解決済み] なぜC++ STLは "ツリー "コンテナを提供しないのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】Vimのオートコンプリートについて
-
[解決済み】なぜ可変長配列はC++の標準に含まれないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】C++の余分な資格エラー
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない