web-dev-qa-db-ja.com

かっこではなく中かっこで直接初期化を使用する場合、誰かのコードから何を推測できますか?

これまで、ほとんどの変数を次のように初期化しています。

const QString foo("bar");

私の新たな理解から、これは直接初期化として知られていますhttp://en.cppreference.com/w/cpp/language/direct_initialization

私は誰かのコードを見ていて、名前空間では、カーリーブレースで変数を初期化していました:

const QString foo{"bar"};

これは直接初期化としてもカウントされます: enter image description here

これが今日までのことだとは知りませんでした。

コードは書かれたよりも読み取られることが多いのですが、括弧と比較して、中括弧を使用した直接の初期化は何を意味しますか?

constは変数が変更されないことを教えてくれるのを理解しているように、この中括弧の練習から何かを推測できますか?

4
Akiva

これは、作成者が最新のC++(例:> = C++ 11)を使用しており、適切な方法を適用していることを示しています。

ブレース初期化は、最も広く使用できる初期化構文であり、 変換の縮小 を防ぎ、C++の 最も厄介な解析の影響を受けません。

- Scott Meyers 、in有効な最新のC++、アイテム7

ただし、クラスに初期化子リストのコンストラクタがある場合は、微妙な問題が発生する可能性があることに注意する必要があります。

この構文に慣れていない場合は、スコットマイヤーの上記の本を読むか、たとえば Herb Sutterのビデオ で同等の知識を得ることをお勧めします古くなったC++のスキルに終わらないようにしてください。

6
Christophe

何も推測できないと思います。ここには、意味のある推論を引き出すにはあまりにも多くの可能性があります。

まず、集約は中括弧を使用して初期化できることを覚えておいてください。

struct foo { 
    int x;
    long y;
};

// well formed since long before C++ existed:    
foo bar = { 1, 2 };

// New syntax
foo baz { 2, 3 };

したがって、この場合の唯一の違いは、変数の名前と初期化子の間の=を省くことです。これは便利なことですが、あまり意味がありません。これは文字通り、古い構文を使用するつもりであり、タイプミスのために=が欠落しており、コンパイラーがエラーメッセージを出力しなかったため、修正または通知されない場合があります。

それを念頭に置いて、中括弧の代わりに括弧を使用する必要があった場合を考えてみましょう。

struct abc { 
    int x;
    abc(int x) : x(x) {}
};

したがって、C++ 98/03では、次のような初期化を行いました。

abc def(1);

これで使用できます:

abc def = {1};

または:

abc def{1};

繰り返しになりますが、かなりのケースでabc def = {1};のケースが完全に偶然に起こった可能性は十分にあると思います。誰かがabcが集合体であるかどうかを確認せずにそれを書いた。かつて、コンパイラーは不満を言っていたはずでしたが、コンパイルできるように変更していました。コンパイラーはもはや文句を言わないので、そのままにしておきます。

誤解しないでください:コンバージョンの絞り込みを防ぐことに賛成です1。しかし、人間の性質(および最新のすべての変更は言うまでもなく、標準の詳細をすべて知らずに書かれたC++の量)を考えると、このようなことがより多く発生したり、発生したりするケースはおそらくかなりあると思います偶然ではなく、彼らが働いているので、彼らは一人にされています。


1.可能であれば、すべてがinitializer_listとして解釈されることにそれほど興奮しません。

1
Jerry Coffin