Я пытаюсь понять, каково должно быть правильное поведение С++ 11 при объединении списков инициализации и const auto
. Я получаю различное поведение между GCC и Clang для следующего кода и хотел бы знать, какой из них правильный:
#include <iostream>
#include <typeinfo>
#include <vector>
int main()
{
const std::initializer_list<int> l1 = { 1, 2, 3 };
const auto l2 = { 1, 2, 3 };
std::cout << "explicit: " << typeid(l1).name() << std::endl;
std::cout << "auto: " << typeid(l2).name() << std::endl;
}
Скомпилированный с g++ вывод:
explicit: St16initializer_listIiE
auto: St16initializer_listIKiE
В то время как скомпилированная версия clang++ производит:
explicit: St16initializer_listIiE
auto: St16initializer_listIiE
Кажется, что GCC поворачивает линию auto
в std::initializer_list<const int>
, в то время как Clang производит std::initializer_list<int>
. Версия GCC создает проблему, когда я использую ее для инициализации std::vector
. Таким образом, следующее работает под Clang, но создает ошибку компилятора для GCC.
// Compiles under clang but fails for GCC because l4
std::vector<int> v2 { l2 };
Если GCC создает правильную версию, то, по-видимому, предполагается, что различные контейнеры STL должны быть расширены, чтобы включить перегрузку инициализатора списка для этих случаев.
Примечание. Такое поведение кажется последовательным в нескольких версиях GCC (4.8, 4.9, 5.2) и Clang (3.4 и 3.6).