Правомерно ли, что некоторые компиляторы допускают использование const-квалификатора для выводимого типа в deduction guide?

Опять путанный вопрос от меня. Продолжаю мучать c++ в рамках изучения.

Предыстория. Например, есть какой-то там класс

template <typename T>
struct MyClass {
    MyClass(T const &) {};
    MyClass(T&&) {};
};

Мне нужно сохранить вид "константности" аргумента конструктора при автоматическом выводе типа (т.е., если в качестве аргумента передана константная ссылка, то параметр шаблона должен быть константным типом). Делаю deduction guides:

template <typename T>
MyClass(T&) -> MyClass<T>;

template <typename T>
MyClass(T const &) -> MyClass<T const>;

template <typename T>
MyClass(T&&) -> MyClass<T>;

Прекрасно работает, супер

Тут возникает крамольная мысль: decltype(auto) сохраняет информацию о константности. А нельзя ли передавать эту константность типу, порождаемому вызовом конструктора с авто-выводом типа, добавив ключевое слово const в конце deduction guide.

template <typename T>
MyClass(T const &) -> MyClass<T const> const;

Оказалось странно:

  1. В gcc и msvc добавить ключевое слово const можно.
  2. Это ни на что не влияет

пример

В стандарте написано, что посте -> в deduction guide должен идти некий simple-template-id. Опять же в стандарте написано, что simple-template-id - это template-name < template-argument-list>. template-name - это просто identifier. В общем никаких квалификаторов, ключевых слов и прочего в simple-template-id не входит.

Собственно, вопрос: Правомерно ли, что компиляторы допускают использование const-квалификатора в контексте deduction guide? Или это всё же ошибка со стороны gcc и msvc (clang вот на это ругается "error: deduced type 'const MyClass' of deduction guide is not a specialization of template 'MyClass'")? Или, может быть, в этом есть какой-то смысл?

P/S: IntelliSense от Visual Studio вообще тут лучше всех ))) Он мои мысли прочёл правильно Он мои мысли прочёл правильно


Ответы (0 шт):