C 11 SFINAE 中的「立即上下文」到底是什麼?
「立即上下文」的概念在 C 11 的替換中至關重要失敗不是錯誤 (SFINAE) 習語。根據 C 11 標準,只有函數類型及其範本參數類型的「直接上下文中」的無效類型和表達式才會導致推導失敗。
初步理解
標準在註釋中提供了有限的提示:「替換類型和表達式的計算可能會導致副作用,例如類模板特化、函數模板特化、隱式函數產生等」這些副作用不被視為「直接上下文」的一部分。
決策程序
要確定「直接上下文」是否發生替換錯誤,請遵循以下步驟程序:
具體範例
template<typename T> void func(typename T::type* arg);
func<A<int&>&>(nullptr); // T::type* is invalid, causing a hard error.
template<typename T> void func(typename T::type* arg);
template<> struct A<char> {};
func<A<char>>(nullptr); // T::type* is not defined, leading to a deduction failure.
結論
「直接被除了上下文」指的是可以被除了上下文必要的預實例化步驟之外,不需要額外的模板或函數生成即可解決。預實例化階段發生錯誤會導致硬編譯錯誤,而後續替換階段發生錯誤會導致推演失敗。以上是C 11 SFINAE 中的「直接脈絡」由什麼構成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!