0
#include <iostream>
#include <string>

int main() {
    std::pair<std::string, int> s;
    std::cout << s.second << std::endl;
}

この例s.secondでは0、初期化されていません。なぜそれが定義されているC++標準へのリンクを提供できますか0s.secondで初期化されているためだとは思いますが、が記載されているint()標準の行が見つかりません。int()0

4

3 に答える 3

6

これは

8.5イニシャライザー[dcl.init]

10)初期化子が空の括弧のセット、つまり()であるオブジェクトは、値で初期化されるものとします。

7)タイプTのオブジェクトを値初期化するということは、次のことを意味します
。— Tがユーザー提供のコンストラクター(12.1)を持つ(おそらくcv修飾された)クラスタイプ(条項9)である場合、Tのデフォルトコンストラクターが呼び出されます(およびTにアクセス可能なデフォルトコンストラクタがない場合、初期化は不正な形式になります。
— Tがユーザー提供のコンストラクターのない(おそらくcv修飾された)非ユニオンクラスタイプである場合、オブジェクトはゼロで初期化され、Tの暗黙的に宣言されたデフォルトコンストラクターが自明でない場合、そのコンストラクターが呼び出されます。
— Tが配列型の場合、各要素は値で初期化されます。
—それ以外の場合、オブジェクトはゼロで初期化されます。

そして私は推測します

5)T型のオブジェクトまたは参照をゼロで初期化するということは、次のことを意味します
。— Tがスカラー型(3.9)の場合、オブジェクトは値0(ゼロ)に設定され、積分定数式としてTに変換されます。[...]

于 2013-03-21T13:24:45.833 に答える
5

s.secondがint()によって初期化されるためですが、int()が0であると述べられている標準の行を見つけることができません。

C ++ 11標準でたどる必要のあるパスは次のとおりです。この回答では、現在の公式標準よりも新しいドラフトn3485を参照として使用しています。

C++11規格の8.5/11項によると:

初期化子が空の括弧のセット、つまり()であるオブジェクトは、値で初期化されます。[...]

さらに、C++11規格の8.5/8項によると:

タイプTのオブジェクトを値初期化するということは、次のことを意味します。

— Tが(おそらくcv修飾された)クラスタイプ(第9節)であり、デフォルトコンストラクター(12.1)がないか、ユーザー提供または削除されたデフォルトコンストラクターがある場合、オブジェクトはデフォルトで初期化されます。

— Tが(おそらくcv修飾された)非ユニオンクラスタイプであり、ユーザーが提供または削除したデフォルトコンストラクターがない場合、オブジェクトはゼロで初期化され、Tに重要なデフォルトコンストラクターがある場合は、デフォルトで初期化されます。

— Tが配列型の場合、各要素は値で初期化されます。

それ以外の場合、オブジェクトはゼロで初期化されます

最後に(これは非常に直感的ですが)、8.5 /6項によると:

タイプTのオブジェクトまたは参照をゼロで初期化するということは、次のことを意味します。

Tがスカラー型(3.9)の場合、オブジェクトは値0(ゼロ)に設定され、積分定数式と見なされ、Tに変換されます。

— [...]

于 2013-03-21T13:25:34.830 に答える
3

s.secondがint()によって初期化されるためだと私は知っています

標準では、実際にはそれsecondがで初期化されるとは言われていませんint()std::pairこれは、デフォルトのコンストラクターを(§20.3.2)として作成する効果を与えるだけです。

効果:値-1番目と2番目を初期化します。

値の初期化は次のように定義されます(§8.5):

タイプのオブジェクトを値初期化Tするということは、次のことを意味します。

  • ifTが(おそらくcv修飾された)クラスタイプ(第9節)[...]

  • ifTが(おそらくcv修飾された)非ユニオンクラスタイプ[...]

  • が配列型の場合T、[...]

  • それ以外の場合、オブジェクトはゼロで初期化されます。

(§8.5)であるため、 Whcihsecondはゼロで初期化されます。int

オブジェクトまたはタイプの参照をゼロで初期化Tするということは、次のことを意味します。

  • Tスカラー型(3.9)の場合、オブジェクトは値0(ゼロ)に設定され、積分定数式と見なされ、Tに変換されます。

  • [...]

于 2013-03-21T13:30:07.277 に答える