2017-03-31 77 views
6

我使用一個extern C函數返回動態分配的const char*爲什麼沒有const void *的std :: free重載?

我想用unique_ptr<const char, decltype(std::free)>來管理它。

但是沒有std::free(const void*)過載,所以我得到invalid conversion from 'const void*' to 'void*'並且必須使用const_cast<char*>()

這僅僅是一個標準庫的不完美或者有其他的東西嗎?

+3

@ForceBru,指針不是'const',它指向'const'內存。 – sad1raf

+2

@ForceBru:[''刪除''const'指針](http://stackoverflow.com/q/755196/10077)可以。 –

+0

@FredLarson,不知道,謝謝你的信息! – ForceBru

回答

2

std::free是繼承自C標準庫。 C沒有超載,所以const超載不能被繼承。

儘管C++標準庫已經擴展了繼承的C庫,但仍有一些有用的重載,但沒有添加const過載。

從未考慮過這樣的過載,或者認爲它不足以保證其增加到標準。我還沒有找到任何可以公開提出的建議 - 雖然我沒有看過曾經有過的所有建議,也沒有參加任何委員會會議或研討會,所以我不能否認有這樣一種存在的可能性文件。

要解決缺乏這種超負荷的問題,您確實可以使用const_cast。在這種情況下,這是完全安全的。

+1

這不需要過載。採用'const void *'的單個函數可以在C和C++中使用。 – hvd

+0

@ hvd當然。但是,C++標準是否改變了C庫函數的任何函數簽名?委員會是否會考慮這樣的選擇?我不會這樣認爲,但也許。也許C庫會被改變,但是我認爲考慮到隱式const T * - > T *轉換在C中是合法的,我認爲它們不是優先考慮的事情。 – user2079303

+0

是的,C++標準改變了C庫函數的函數簽名(參見'strchr'),但不,我不是這個意思。 *如果C委員會聲明'free(const void *)'是有意義的,並相應地調整了它的簽名,那麼C++就可以採用它。不,標準C沒有隱式的'const T *' - >'T *'轉換,並且從來沒有。 C編譯器可以自由支持它作爲擴展。 C++編譯器也被允許作爲擴展來支持它,只不過它在C++中正確執行它更加困難,因爲它可能會破壞SFINAE的使用,這就是爲什麼C++編譯器通常不會 – hvd

相關問題