Есть ли способ отключить автоматическое объявление для нестандартных типов?

ОБНОВЛЕНИЕ: есть предложение изменить смысл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.)

Ответы на вопрос(1)

Ваш ответ на вопрос