I was recently working on a C++ project and came across an edge case with the string constructors that I can't fully understand. The relevant code (which you can run here) is as follows:
#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;
}
The brace-initialized versions of the strings end up having two characters in them, namely, a char
with numeric value 1 followed by a star.
I don't understand why the brace-initialized versions of the string invoke the initializer_list
constructor rather than the constructor taking in a size and a character. The initializer_list
constructor has this signature:
basic_string(std::initializer_list<CharT> init,
const Allocator& alloc = Allocator());
Given that string
is an alias for basic_string
char, the specific signature would be
string(std::initializer_list<char> init,
const Allocator& alloc = Allocator());
How is the initializer {1, '*'}
, which contains elements both of type int
and of type char
, matching this constructor? I was under the impression that all literals in an std::initializer_list
must have the same type - is that incorrect?
Aucun commentaire:
Enregistrer un commentaire