Pytanie Dlaczego std :: remove_const nie usuwa ograniczenia const?


Zauważ, że używam std::thread aby uzyskać czytelne typy w błędach:

int main() {
    const int * first;
    using deref = decltype(*first);
    std::thread s = std::remove_const<deref>::type{}; // const int ???
    std::thread s2 = deref{}; // const int
    std::thread s3 = std::remove_const<const int>::type{}; // int 
}

Wygląda jakby remove_const<deref>::type jest const int, nie można go zmienić int tak jak się spodziewałam.


21
2018-04-17 15:23


pochodzenie


Twój tytuł mówi remove_reference, ale nie używasz tego w swoim ciele. - Baum mit Augen
tnx, naprawiono, korzystałem zarówno z oryginalnego kodu, więc go pomieszałem :) - NoSenseEtAl
Polecam, którego używasz to aby wyświetlać typy zamiast swoich std::thread metoda, ponieważ pokazuje rzeczywisty typ, który jest const int & podczas gdy twoja metoda leży w tobie i pokazuje const int. - nwp
mutable jest specyfikatorem klasy pamięci, nie jest częścią typu. - Simon Richter


Odpowiedzi:


Zauważ, że *first jest wyrażeniem lwartości, a następnie typem wyniku decltype(*first) byłoby const int&, tzn. odniesienie do const int. Odniesienie nie jest const sam (nie może być const-kwalifikowany, nie ma czegoś takiego jak int& const), za pomocą std::remove_const na nim przyniesie ten sam typ, tj. const int&.

Widzieć specyfikator decltype:

3) Jeśli argument jest dowolnym innym wyrażeniem typu T, i

b) jeżeli kategoria wartości wyrażenia to l-wartość, to decltype plony    T&;

Możesz użyć std::remove_const z std::remove_reference razem:

std::remove_const<std::remove_reference<deref>::type>::type // -> int
                                        ~~~~~               // -> const int &
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        // -> const int

BTW:

Zauważ, że używam std::thread aby uzyskać czytelne typy w błędach:

Zauważ, że nie podaje poprawnego typu dla tego przypadku. Oto pomocnik szablonu klasy dla tego z Efektywny nowoczesny C ++ (Scott Meyers):

template<typename T>
class TD;

i używaj go jako

TD<deref> td;

Otrzymasz komunikat o błędzie zawierający typ deref, np. od szczęk:

prog.cc:16:11: error: implicit instantiation of undefined template 'TD<const int &>'
TD<deref> td;
          ^

30
2018-04-17 15:29



Aaa i dlatego powinieneś pisać int const & zamiast const int&... wtedy odpowiedź na pytanie jest oczywista. - Mehrdad