Misalkan saya memiliki tipe callable seperti:
struct mutable_callable
{
int my_mutable = 0;
int operator()() { // Not const
return my_mutable++;
}
};
Catatan yang mutable_callable
memiliki non-const operator()
yang memodifikasi variabel anggota .....
Sekarang anggaplah saya membuat std::function
keluar dari tipeku:
std::function<int()> foo = mutable_callable{};
Sekarang saya bisa melakukan ini:
void invoke(std::function<int()> const& z)
{
z();
}
int main()
{
invoke(foo); // foo changed.....oops
}
Sekarang sejauh yang saya tahu std::function
s operator()
adalah const
sebagai per:
https://en.cppreference.com/w/cpp/utility/functional/function/operator ()
Jadi firasatku adalah kamu tidak seharusnya bisa melakukan ini .....
Tetapi kemudian melihat: https://en.cppreference.com/w/cpp/utility/functional/function/function
Ini sepertinya tidak menempatkan kendala pada apakah tipe callable memiliki konstanta operator()
......
Jadi pertanyaan saya adalah ini: Saya benar dalam mengasumsikan bahwa std::function<int()> const&
pada dasarnya hal yang sama dengan std::function<int()>&
yang ada sebenarnya tidak ada perbedaan antara perilaku keduanya ...... dan jika itu masalahnya mengapa tidak const
benar?
sumber
std::function
memiliki yang setara denganstruct a{ std::any x; };
di dalamnya .....std::function
implementasi MSVC : i.stack.imgur.com/eNenN.png di manausing _Ptrt = _Func_base<_Ret, _Types...>
. Saya mengistirahatkan koper saya.Jawaban:
Ini bermuara sama seperti
struct A { int* x; };
, di mana dalamconst A a;
Anda dapat memodifikasi nilai dari*(a.x)
(tapi tidak di mana itu menunjuk ke). Ada tingkat tipuan dalamstd::function
(dari tipe penghapusan) melalui manaconst
tidak diperbanyak.Dan tidak,
std::function<int()> const& f
tidak ada gunanya. Dalamstd::function<int()>& f
Anda akan dapat menetapkan functor yang berbedaf
, yang tidak dapat Anda lakukan dalamconst
kasus ini.sumber
std::vector
apakah ini,std::unique_ptr
tidak. Saya merasastd::function
tidak benar-benar tentang mengekspresikan invarian dari negara functor. Mungkin kita bisa mengubah jenis fungsi yang menjijikkan (yaitustd::function<int() const>
) untuk membedakan?unique_ptr
seharusnya tidak menyebarkan kesegaran, karena pointer biasa tidak. Danstd::function<int() const>
tidak akan dikompilasi.std::function
tidak jelas. Danstd::function<int() const>
itu adalah hipotetis - tentu saja itu tidak dikompilasi sekarang, tetapi apakah itu memuaskan misalnya OP di sini jika itu dapat dibuat valid, dengan menyatakan "hanya dapat ditugaskan fungsi denganoperator() const
(atau yang tanpa kewarganegaraan)"? (bahkan jika di belakang layar itu akan sangat mengerikan, karena menggunakan jenis fungsi yang menjijikkan)?