Тонкости инициализации скобки

Пытаясь использовать инициализация скобки, тонкость, которая может быть найдена при использовании std::vector, как показано в следующем примере:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

template <typename T>
void print(const char * msg, const vector<T>& v) {
cout << msg << endl;
cout << "Size: " << v.size() << endl;
for (size_t i = 0; i < v.size(); ++i) {
cout << "#" << (i+1) << ": " << v[i] << endl;
}
cout << "---------------------" << endl;
}

int main() {
vector<string> vs{3};
print("vector<string> vs{3};", vs);

vector<int> vi{3};
print("vector<int> vi{3};", vi);
}

Выход:

vector<string> vs{3};
Size: 3
#1:
#2:
#3:
---------------------
vector<int> vi{3};
Size: 1
#1: 3
---------------------

Итак, в первом случае (так называемый …) единообразный инициализация инициализирует вектор, содержащий три пустых строки, вместо этого во втором случае он инициализирует вектор, содержащий только одно целое число, имеющее значение 3.

Помимо этого, есть ли другие «хитрости» и тонкости, которые следует учитывать при использовании нового стиля инициализации фигурной скобки?

2

Решение

Кажется, вы уже понимаете жадную природу конструкторов списка инициализатора для контейнеров. Для других удивительных «гач» см. этот вопрос& где я попал под это

std::string{ 65, 'C' } // NOT 65 times 'C', but "AC" ('A' is 65th character).
3

Другие решения

Других решений пока нет …