在任何兼容的編譯器中,編譯必須失敗。
SFINAE規則基於聲明而不是定義。 (很抱歉,如果我在這裏使用了錯誤的術語),我的意思是這樣的:
對於類/結構:
template < /* substitution failures here are not errors */ >
struct my_struct {
// Substitution failures here are errors.
};
對於函數:
template </* substitution failures here are not errors */>
/* substitution failures here are not errors */
my_function(/* substitution failures here are not errors */) {
/* substitution failures here are errors */
}
另外,給定的模板參數集的struct/function不存在也受到SFINAE規則的約束。
現在static_assert
只能出現在替換失敗是錯誤的區域,因此,如果它觸發,你會得到一個編譯器錯誤。
例如,下面將是一個錯誤的執行enable_if
:
// Primary template (OK)
template <bool, typename T>
struct enable_if;
// Specialization for true (also OK)
template <typename T>
struct enable_if<true, T> {
using type = T;
};
// Specialization for false (Wrong!)
template <typename T>
struct enable_if<false, T> {
static_assert(std::is_same<T, T*>::value, "No SFINAE here");
// The condition is always false.
// Notice also that the condition depends on T but it doesn't make any difference.
};
那就試試這個
template <typename T>
typename enable_if<std::is_integral<T>::value, int>::type
test(const T &t);
void test(...);
int main()
{
std::cout << std::is_same<decltype(test(0)), int>::value << std::endl; // OK
std::cout << std::is_same<decltype(test(0.0)), void>::value << std::endl; // Error: No SFINAE Here
}
如果刪除的enable_if
專業化爲false
然後將代碼編譯和輸出
1
1
可能重複[我如何強制客戶端調用明確專用的模板而不是主模板?](http://stackoverflow.com/questions/16286303/how-can-i-force-a-client-to-call-一個明確專用的模板而不是t) – 2013-04-30 15:00:23