傳遞一個元素到拉姆達的算法裏面,我希望創建一個引用給const接受元素的拉姆達:引用給const
template<typename Iterator>
void solve_world_hunger(Iterator it)
{
auto lambda = [](const decltype(*it)& x){
auto y = x; // this should work
x = x; // this should fail
};
}
編譯器不喜歡這個代碼:
Error: »const«-qualifier cannot be applied to »int&« (translated manually from German)
然後我意識到decltype(*it)
已經是一個參考,當然那些不能進行const
。如果我刪除const
,代碼會編譯,但我想要x = x
失敗。
讓我們相信程序員(這是我)一分鐘,並擺脫const
和顯式&
,無論如何,由於參考摺疊規則而被丟棄。但是等一等,實際上是decltype(*it)
保證是一個參考,還是我應該加上明確的&
是安全的?
如果我們不信任的程序員,我能想到的兩種解決方案來解決這個問題:
(const typename std::remove_reference<decltype(*it)>::type& x)
(const typename std::iterator_traits<Iterator>::value_type& x)
您可以自己決定哪一個是醜陋的。理想情況下,我想要一個不涉及任何模板元編程的解決方案,因爲我的目標受衆以前從未聽說過。所以:
問題1:decltype(*it)&
總是和decltype(*it)
一樣嗎?
問題2:如何在沒有模板元編程的情況下通過reference-to-const傳遞元素?
英文錯誤會很好! :) – Pubby
@Pubby我盡我所能,隨時糾正:) – fredoverflow
@sehe問題不是關於頂級常量。 –