C++ 11's auto
ключевое слово отлично.Есть ли способ отключить автоматическую декларацию для нестандартных типов?
Однако, по моему мнению, если тип Не Regular (смотри, например, What is a "Regular Type" in the context of move semantics?) использование 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
.)
Добавляет 'static_assert', где вы назначаете возможность? – wasthishelpful
@wasthishelpful, назначение не является проблемой, я могу реализовать семантику, которая мне нужна в 'operator =', или даже удалить ее. Проблема заключается в том, что этот синтаксис 'auto r = rd' позволяет разрешить его с неправильным значением (что на C++ невозможно изменить). Строка 'auto r = rd' не является назначением, а конструкцией с (неправильным) выводом типа. (более конкретно, для «ссылочного типа» это (или должна быть) операция привязки). – alfC
Согласно http://www.cplusplus.com/reference/functional/reference_wrapper/, вы можете получить доступ к своему значению, вызвав 'ref.get()'. Построение из этого должно быть однозначным. –