Есть ли способ отключить автоматическое объявление для нестандартных типов?
ОБНОВЛЕНИЕ: есть предложение изменить смыслauto
в определенных ситуациях.
Неявная оценка «автоматических» переменных и аргументов Джоэл Фальку и другие.
Неявная оценка должна:
Включите реализации класса, чтобы указать, что объекты этого класса оцениваются в операторе auto;Позвольте им определить тип оцениваемого объекта;...
C ++ 11-хauto
Ключевое слово отлично.
Однако, по моему мнению, если типНе обычный (см. например,Что такое «обычный тип» в контексте семантики перемещения?) использованиеauto
становится сложно.
Есть ли способ отключитьauto
декларация для такого типа?
Предположим, у кого-то естьref
класс, который имитирует ссылку
double 5.;
ref<double> rd = d; // `ref` behaves like a reference, so it is not a regular type
ref<double> rd2 = rd; // `ref` can be (syntactically) copy constructible, (it is not regular for other reason)
auto r = rd; // now r is not `double`, but EVEN WORST it is `ref<double>`.
(в реальной жизни это был бы более сложный класс, важным моментом является то, что класс под рукой не является регулярным.)
Единственный способ, который я нашелauto r = rd
не работать (дать ошибку компиляции) означает сделать класс не копируемым, однако мне нужно, чтобы класс имел конструктор копирования (со специальной семантикой, но конструктор копирования все еще).
Есть ли способ отключить синтаксисauto r = rd
каким-то образом? когдаdecltype(rd)
не регулярно.
(Еще лучше было бы как-то сказать компилятору, чтоauto
надо делать точно).
Примечание: это не очень искусственная проблема, можно увидеть, что этот тип проблемы лежит в основеstd::vector<bool>::reference
(который также является справочной оболочкой). Отключение (как-то) синтаксисаauto b = v[10]
не решит проблемуstd::vector<bool>
но это усложнит плохое использование.
Я что-то пропустил? Должен ли я изменить какую-то другую часть дизайна? Если у нерегулярных классов есть черта типа, которая поможет компилятору определить более общее авто (например, выводитьbool
заauto b = v[10]
гдеstd::vector<bool> v
.)