12

C++の文字列クラスで統一イニシャライザを試しています。以下はコードです:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string str1 {"aaaaa"};
    string str2 {5, 'a'};
    string str3 (5, 'a');

    cout << "str1: " << str1 << endl;
    cout << "str2: " << str2 << endl;
    cout << "str3: " << str3 << endl;

    return 0;
}

出力は次のようになります。

str1: aaaaa
str2: a
str3: aaaaa

これには頭を悩ませました。str2として望ましい結果を達成できないのはなぜstr3ですか?

4

2 に答える 2

9

std::stringinitializer_list引数を取るコンストラクタがあります。

basic_string( std::initializer_list<CharT> init,
              const Allocator& alloc = Allocator() );

を構築するために波括弧初期化リストを使用する場合、そのコンストラクターは常に優先されstd::stringます。その他のコンストラクターは、 braced-init-list内の要素が 内の要素の型に変換できない場合にのみ考慮されinitializer_listます。これは[over.match.list]/1に記載されています。

最初は、候補関数はクラスの初期化子リスト コンストラクター ([dcl.init.list]) でTあり、引数リストは単一の引数としての初期化子リストで構成されます。

あなたの例では、最初の引数5は暗黙的に に変換可能charであるため、initializer_listコンストラクターは実行可能であり、選択されます。

これは、文字列内の各文字をintsとして出力すると明らかです

void print(char const *prefix, string& s)
{
    cout << prefix << s << ", size " << s.size() << ": ";
    for(int c : s) cout << c << ' ';
    cout << '\n';
}

string str1 {"aaaaa"};
string str2 {5, 'a'};
string str3 (5, 'a');

print("str1: ", str1);
print("str2: ", str2);
print("str3: ", str3);

出力:

str1: aaaaa, size 5: 97 97 97 97 97 
str2: a, size 2: 5 97 
str3: aaaaa, size 5: 97 97 97 97 97 

ライブデモ

于 2016-08-06T22:48:25.857 に答える
9

この署名でstd::stringのコンストラクタを使用しています

std::basic_string( std::initializer_list<CharT> init, const Allocator& alloc = Allocator() );

また、コンパイラは型として扱わ5れ、画面に出力されない型charに変換されます。それを印刷可能な値にASCII変更すると、ASCII値が5A65

string str2 {65, 'a'};

それは印刷されます:

Aa

イラストを追加してColiruでライブを見る

于 2016-08-06T22:37:05.743 に答える