Конструктор авто и копирования: что не так?

Рассмотрим следующий код:

#include<queue>
#include<type_traits>

int main() {
    std::queue<int> q;
    auto p{q};
    static_assert(std::is_same<decltype(q), decltype(p)>::value, "fail");
}

Он прекрасно компилируется с GCC 5.1.0 (см. Здесь) и clang 3.8.0 (см. Здесь), но не с GCC 4.9.0 (см. Здесь).
Из дальнейшего анализа, кажется, связано с тем, что тип p выводится как std::initializer_list,
Например, это работает, если заменить строку:

auto p{q};

С линией:

decltype(q) p{q};

Я не уверен, какой из них правильный (хотя GCC 5.1.0 работает в соответствии с моими ожиданиями), и именно поэтому я спросил здесь.
Правильно ли ожидать тип p быть std::queue<int>?

2 ответа

Решение

Это известный дефект в стандарте, который auto выводящей {} как std::initializer_list, Существует предлагаемое изменение, чтобы исправить этот дефект.

Более новые gcc и clang реализуют предложенное разрешение, а gcc-4.9 - нет.

Нет.{q} оценивает std::initializer_list, Компилятору нечего сказать, что вам может понадобиться что-то еще, так что auto использует это.

Также decltype(q) это не то же самое, что decltype({q});

Другие вопросы по тегам