時可以這麼推斷的類型,我有一種方法及其一類的過載,這樣寫的:編譯器無法使用std ::函數
bool my_for_each(someIterator begin, someIterator end, bool (*_lambda)(someIterator));
void my_for_each(someIterator begin, someIterator end, void (*_lambda)(someIterator));
正如你看到的,唯一的區別是簽名一個傳遞的函數,也就是它的返回類型。 雖然上面的代碼工作完全正常,當我把它稱爲:
my_for_each(iteratorBegin, iteratorEnd, [](someIterator) {; }); // calls void version
my_for_each(iteratorBegin, iteratorEnd, [](someIterator)->bool {return false; }); // calls bool version
...,如果我寫的my_for_each功能如下:
bool my_for_each(someIterator begin, someIterator end, std::function<bool(someIterator)> _lambda);
void my_for_each(someIterator begin, someIterator end, std::function<void(someIterator)> _lambda);
的代碼編譯失敗,如果我調用該函數以同樣的方式(C2668模糊調用重載函數)。雖然,如果我手動投功能:
my_for_each(iteratorBegin, iteratorEnd, static_cast<std::function<void(someIterator)>>([](someIterator) {; })); //calls void version
my_for_each(iteratorBegin, iteratorEnd, static_cast<std::function<bool(someIterator)>>([](someIterator) -> bool { return false; })); //calls bool version
代碼工作完全正常。所以我只是想知道:
- 爲什麼正常的函數指針類型扣除「比std模板更強」?
- 是否有一些有點解決方法仍然使用更通用的版本,而不是手動投射參數?
編譯器是VS2015。
謝謝,祝你有美好的一天!
@FrançoisAndrieux固定的,只是抄寫錯誤 – Alfaix
什麼是返回值的'my_for_each'功能的含義是什麼? –
它似乎是兩個形成一個範圍的迭代器,它接受一個迭代器並對它做些什麼。我不確定第二個版本中的所有「布爾」是怎麼做的(推測可能是an和or或者operation)。 –