Próbuję jakoś wyłączyć/oznaczyć jako przestarzałe ohydne przeciążenie std::string::operator=(char)
(które w moim doświadczeniu jest używane tylko wtedy, gdy błędnie przypisuję liczbę całkowitą do napisu i powoduje subtelne i trudne śledzenie błędów).Jak oznaczyć * funkcję/metodę standardowej biblioteki * jako wycofaną (lub wyłączoną w ogóle) w moim projekcie?
Próbowałem z:
wyraźne specjalizacji ze statycznym dochodzić w nim
#include <string> #include <type_traits> template<> std::basic_string<char> &std::basic_string<char>::operator=(char c) { static_assert(false, "Don't use this!"); }
która nie jak
<string>
już robi wyraźne konkretyzacjistd::string
- atrybutu
[[deprecated]]
, zastosowane do podobnej deklaracji jak powyżej w różnych pozycjach; żadna pozycja, którą próbowałem, nie przyniosła żadnego rozsądnego rezultatu; =delete
, które zawiedzie z powodów podobnych do powyższych;- Pomyślałem o zastosowaniu sztuczek linkerów (w podobnym duchu, w tym samym projekcie mamy sprawdzanie w czasie wykonywania zabłąkanych
setlocale
zastosowań przy użyciu opcji linkera--wrap
ld
), ale fakt, że jest to szablon i metoda inline, komplikuje sprawę.
teraz do pytania:
- istnieje standardowa metoda jakoś wyłączyć (jak by się stało z
=delete
) dowolną funkcję lub metodę w bibliotece standardowej (czytaj: w bibliotece, gdzie nie można zmieniać deklaracje w nagłówkach)? - jak wyżej, ale zamiast wyłączać, dodaj ostrzeżenie (tak jak w przypadku
[[deprecated]]
); - w przypadku braku standardowej metody, czy jest coś g ++ - konkretnego?
- jeśli nie ma rozwiązania "ogólnego" (= dotyczy dowolnej metody, dowolnej klasy, dowolnej funkcji, ...), czy jest coś, co moglibyśmy zastosować do tego konkretnego przypadku (= wyłączenie metody klasy szablonu, ewentualnie nawet konkretna instancja)?
Masz śmieszne definicję „przestarzałe”, jeśli starasz się używać statycznego stwierdzenia lub usuniętą funkcję. –
@ JonathanWakely: "przestarzałe lub całkowicie wyłączone"; ale o ile mi wiadomo, to w zasadzie takie same, to pewnie użyć '-Werror' na takiego ostrzeżenia w każdym razie, nie ma ważny powód, by użyć tego operatora przypisania (dokładnie tak, jak nie ma powodu, aby użyć, powiedzmy,' dostaje 'lub ciąg literal =>' char * 'oprócz zgodności ze starszym kodem). –