Słowo kluczowe w C++ 11: auto
jest świetne.Czy istnieje sposób na wyłączenie automatycznej deklaracji dla nieregularnych typów?
Jednak moim zdaniem, jeśli typ jest nieregularny (patrz na przykład What is a "Regular Type" in the context of move semantics?) wykorzystanie auto
staje się trudne.
Czy istnieje sposób wyłączenia deklaracji auto
dla tego typu?
Załóżmy jeden ma ref
klasy, która emuluje odniesienie
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>`.
(w prawdziwym życiu byłoby bardziej skomplikowane klasy, ważne jest to, że klasa pod ręką nie jest regularny.)
Jedyny sposób, w jaki znalazłem auto r = rd
nie działać (podać błąd kompilacji) jest spowodowanie, że klasa nie może być kopiowana, jednak potrzebuję klasy, aby mieć konstruktora kopii (ze specjalną semantyką, ale wciąż konstruktor kopii).
Czy jest jakiś sposób wyłączenia składni auto r = rd
w jakiś sposób? gdy decltype(rd)
nie jest regularny.
(Jeszcze lepiej byłoby móc w jakiś sposób powiedzieć kompilatorowi, co dokładnie powinien zrobić auto
).
Uwaga: nie jest to bardzo sztuczny problem, można zauważyć, że ten typ problemu jest rdzeniem std::vector<bool>::reference
(który jest również opakowaniem referencyjnym). Wyłączenie (w jakiś sposób) składni auto b = v[10]
nie rozwiąże problemu z std::vector<bool>
, ale utrudni to nieprawidłowe użycie.
Czy brakuje mi czegoś? Czy powinienem zmienić inną część projektu? Gdyby nie regularne zajęcia mają typ cechę, która pomogłaby kompilator określić bardziej ogólne Auto (na przykład wyprowadzić bool
dla auto b = v[10]
gdzie std::vector<bool> v
.)
Czy dodajesz 'static_assert', do którego przypisujesz możliwość? – wasthishelpful
@wasthishelpful, zadanie nie stanowi problemu, mogę zaimplementować semantykę potrzebną w 'operator =', lub nawet ją usunąć. Problem polega na tym, że pozwala to na składnię 'auto r = rd' i pozwala na jej niewłaściwe znaczenie (co wydaje się niemożliwe do zmiany w C++). Wiersz 'auto r = rd' nie jest przypisaniem, ale konstrukcją z (błędnym) odjęciem typu. (bardziej szczegółowo, dla "typu referencyjnego" jest (lub powinna być) operacją wiążącą). – alfC
Zgodnie z http://www.cplusplus.com/reference/functional/reference_wrapper/ możesz uzyskać dostęp do swojej wartości, wywołując 'ref.get()'. Konstruowanie z tego powinno być jednoznaczne. –