Fungsi kelebihan beban harus mengambil kedua functors, mengingat jenis lambda adalah decidable (castable to a std::function
(tolong perbaiki saya jika saya salah). Pertanyaannya adalah: Mengapa ada kesalahan kompilasi di bawah, meskipun jenis lambda secara eksplisit didefinisikan? ( [&]() -> Type {}
)
Harap dicatat, bahwa untuk solusi saya saat ini, saya perlu menangkap-oleh-referensi, itu sebabnya kode berisi logika untuk itu.
Contoh berikut menjelaskan masalah:
#include <iostream>
#include <string>
#include <functional>
void do_some(std::function<void(int)> thing)
{
thing(5);
}
void do_some(std::function<bool(int)> thing)
{
if (thing(10))
{
std::cout << "it's true!" << std::endl;
}
}
int main()
{
int local_to_be_modified = 0;
do_some(
[&](int in)
{
local_to_be_modified = in;
std::cout << "This is void-" << std::endl;
}
);
do_some(
[&](int in) -> bool
{
// error: call to 'do_some' is ambiguous
local_to_be_modified += in;
std::cout << "This is bool-" << std::endl;
return true;
}
);
}
c++
c++11
lambda
implicit-conversion
std-function
David Tth
sumber
sumber
std::function<void(int)>
dapat dibangun bahkan dari lambda yang mengembalikan sesuatu (yang menyebabkan nilai pengembalian diabaikan).Jawaban:
Karena ekspresi lambda ke-2
bool
dapat dikonversi ke keduanyastd::function<void(int)>
danstd::function<bool(int)>
secara implisit.std::function
memiliki konstruktor yang mengubah:Sebagai definisi dari Callable ,
Perhatikan bahwa lambda ke-2
bool
, untukstd::function<void(int)>
, seperti yang ditunjukkan di atas,static_cast<void>(INVOKE(f, t1, t2, ..., tN))
adalah ekspresi yang valid (yang dikembalikanbool
hanya dikonversi kevoid
). Kemudian bisa juga dikonversi kestd::function<void(int)>
secara implisit dan menyebabkan masalah ambiguitas.sumber
Anda dapat secara eksplisit
static_cast
lambda ke tipe yang tepatAtau simpan lambda ke
std::function<bool(int)>
jenis yang tepat dan berikan ke fungsi (jikado_some(lmda)
harus dipanggil berkali-kali)Atau seperti yang disarankan @MaxLanghof, buat saja
std::function<bool(int)>
dari lambda saat bepergiansumber
static_cast
dan hanya membangunstd::function
langsung dari itu. Itu semua yang terjadi selama konversi implisit.static_cast<
dan bertahan>
dan itu akan melakukan hal yang sama tetapi dengan kurang mengetik. Tidak perlu lebih banyak garis atau apa pun. godbolt.org/z/fQTqF4