Инициализировать std:: array кортежей с фигурными фигурными скобками

У этого, вероятно, очень простой ответ, но я действительно не могу понять это. Почему я получаю ошибки для этого? Какой правильный способ инициализировать что-то вроде этого?

std::array<std::tuple<int, std::string>, 3> tuples{
    {3, "a"},
    {7, "b"},
    {2, "c"}
};

На MSVC 2015 я получаю следующие ошибки:

No suitable constructor exists to convert from "int" to "std::tuple<int, std::string>"
No suitable constructor exists to convert from "const char[2]" to "std::tuple<int, std::string>"

Ответы

Ответ 1

Это проблема с tuple. См. его конструктор в С++ 11/14 - explicit. И, следовательно, он не может участвовать в инициализации списка копий, что и делают внутренние скопированные-init-списки (внешние - это инициализация прямого списка).

Идея заключалась в препятствовать тому, чтобы вы могли обойти конструкторы класса explicit через tuple. Но в С++ 17 это будет изменено: если все типы кортежей сами по себе неявно конвертируются из соответствующего заданного типа, тогда тоже будет этот конструктор tuple.

В вашем конкретном случае использования вы можете использовать std:: pair. Его конструктор никогда не explicit.