Конструктор авто и копирования: что не так?
Рассмотрим следующий код:
#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})
;