मैं हाल ही में एक सी ++ प्रोजेक्ट पर काम कर रहा था और स्ट्रिंग कंस्ट्रक्टर के साथ एक एज केस में आया था जिसे मैं पूरी तरह से समझ नहीं सकता। इस प्रकार प्रासंगिक कोड (जो you can run here) है:यह कोड एक वर्ण में एक स्ट्रिंग को प्रारंभ करने के लिए प्रारंभकर्ता_सूची कन्स्ट्रक्टर क्यों कॉल करता है?
#include <iostream>
#include <string>
using namespace std;
int main() {
string directParens(1, '*');
string directBraces{1, '*'};
string indirectBraces = {1, '*'};
cout << directParens.size() << endl; // 1
cout << directBraces.size() << endl; // 2
cout << indirectBraces.size() << endl; // 2
return 0;
}
तार की ब्रेस-प्रारंभ संस्करणों उन में दो पात्रों को खत्म, अर्थात्, संख्यात्मक मान 1 के साथ एक char
एक स्टार का स्थान है।
मुझे समझ में नहीं आ रहा है कि स्ट्रिंग के ब्रेस-प्रारंभिक संस्करणों ने आकार और चरित्र में लेने वाले निर्माता के बजाय initializer_list
कन्स्ट्रक्टर का आह्वान क्यों किया। initializer_list
निर्माता इस हस्ताक्षर है:
basic_string(std::initializer_list<CharT> init,
const Allocator& alloc = Allocator());
यह देखते हुए कि string
basic_string
चार के लिए एक उपनाम है, विशिष्ट हस्ताक्षर होगा
string(std::initializer_list<char> init,
const Allocator& alloc = Allocator());
कैसे है प्रारंभकर्ता {1, '*'}
, जो प्रकार int
के लोग, दोनों शामिल है और इस कन्स्ट्रक्टर से मेल खाने वाले char
टाइप करें? मैं इस धारणा के तहत था कि std::initializer_list
में सभी अक्षरों का एक ही प्रकार होना चाहिए - क्या यह गलत है?
नोट, रूपांतरणों को संकुचित करने के लिए एक अपवाद है [निरंतर अभिव्यक्ति के लिए जिसका परिणाम रूपांतरण के बाद लक्ष्य प्रकार में फिट होगा] (https://stackoverflow.com/a/26974911/1708801) –