Разрешены ли cv-квалификаторы для переменных decltype (auto)?

Стандарт утверждает, что

Если заполнитель является спецификатором типа decltype(auto), T должен быть только заполнителем.

decltype(auto)*x7d = &i;//ошибка, объявленный тип не является простым decltype(auto)

Неясно, разрешены ли cv-квалификаторы. Было бы разумно, если бы они были разрешены. Компиляторы, похоже, не согласны с этим вопросом. Следующий код принимается g++, но отклонен clang++, vС++, похоже, вообще не поддерживает переменные decltype(auto):

int main()
{
    const decltype(auto) sz_text{"test"};
}

Ответ 1

Чтобы ответить на этот вопрос, нам нужно указать предыдущий параграф, в котором указывается, что T. В этом случае [dcl.type.auto.deduct]/2 говорит (внимание мое):

Тип T, содержащий тип заполнителя, и соответствующий инициализатор e, определяются следующим образом:

  • для переменной, объявленной с типом , который содержит тип заполнителя, T - объявленный тип переменной, а e - инициализатор. Если инициализация является инициализацией прямого списка, Инициализатор должен быть списком со списком бит-init, содержащим только один выражение-присваивание и e - выражение-присваивание;

В этом случае T - это весь объявленный тип sz_text, cv-qualifiers и все. И в параграфе, который вы цитируете, совершенно ясно, что если он содержит decltype(auto) в качестве заполнителя, он должен быть таким и не более.

Так что ошибка GCC. И уже сообщалось об этом.