我有一個函數將std::function
作爲參數。但是,我想確保傳入的函數不允許修改傳遞給它的參數。將lambdas轉換爲std :: function時強制執行正確性正確性
這裏是函數的簡單版本(注意:T
就可以了,通常,參考):
template <class T>
void Bar(std::function<void(std::add_const_t<T>)> func)
{
// ...
}
不好的用法:
Bar<int&>([](int&) { /* Do nasty stuff! */ }); /* A-OK! */
我希望禁止這種使用,但是這段代碼編譯得非常好,即使我覺得它不應該。
有趣的事情是,如果我擺脫模板參數,即:
void Bar(std::function<void(const int&)> func)
{
// ...
}
然後,這種用法不會進行編譯(因爲它不應該):
Bar([](int&) { /* Do nasty stuff! */ }); /* Error C2664 */
如何我可以執行此操作並仍保留模板參數嗎?
注'的std :: add_const_t''是INT&'。 –
aschepler
@aschepler我在文檔中也看到了這一點。所以我甚至試着做一個hacky版本:'const T',我想這會推演到'const int&'。但不是。即使我用'const T'替換'std :: add_const_t',它仍然編譯得很好。 –
Zeenobit
@Zeenobit:模板不是宏的。這更類似於'typedef int & T; T const ref;' - 再次'ref'將是'int&'。還要比較指針:'typedef int * T; T const ptr'讓你獲得一個'int * const'而不是'int const *'。 – MSalters