Этот код:
#include <vector>
#include <string>
#include <iostream>
class MyClass
{
public:
MyClass(const std::vector<std::vector<std::string>> & v)
{
std::cout << "Vector of string vectors size: " << v.size() << "\n";
for (size_t i = 0; i < v.size(); i++)
std::cout << "Vector #" << i << " has size " << v[i].size() << "\n";
}
};
int main()
{
MyClass({ { "a" } }); // <--- ok
MyClass({ { "a", "b" } }); // <--- PROBLEM
MyClass({ { std::string("a"), "b" } }); // <--- ok
MyClass({ { "a", "b", "c" } }); // <--- ok
MyClass({ { "a" },{ "c" } }); // <--- ok
MyClass({ { "a", "b" },{ "c", "d" } }); // <--- ok
}
выводит это (Visual Studio 2017):
Vector of string vectors size: 1
Vector #0 has size 1
Vector of string vectors size: 4
Vector #0 has size 97
Vector #1 has size 0
Vector #2 has size 0
Vector #3 has size 0
Vector of string vectors size: 1
Vector #0 has size 2
Vector of string vectors size: 1
Vector #0 has size 3
Vector of string vectors size: 2
Vector #0 has size 1
Vector #1 has size 1
Vector of string vectors size: 2
Vector #0 has size 2
Vector #1 has size 2
Таким образом, он работает нормально во всех случаях, кроме случаев, когда у нас есть вектор одного вектора, содержащий две строки. Он также работает в вышеприведенном случае, если мы явно построим std :: string из одного из строковых литералов. Если оба являются просто строковыми литералами, компилятор, похоже, "запутался" и конструирует вектор из 4 элементов, первый из которых содержит 97 строк. Заметим, что 97 - это код символа "a".
Я думаю, мой вопрос в том, должен ли компилятор интерпретировать эту проблемную конструкцию, как я ожидал, или этот плохой код для инициализации вложенного списка?