Правомерно ли, что некоторые компиляторы допускают использование 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;
Оказалось странно:
- В gcc и msvc добавить ключевое слово
const
можно. - Это ни на что не влияет
В стандарте написано, что посте ->
в 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 вообще тут лучше всех ))) Он мои мысли прочёл правильно