#include <iostream>
#include <functional>
#include <memory>
using namespace std;
template<typename T = int> std::enable_if_t<!std::is_arithmetic<T>{}, T> nope() {}
int main() {
nope();
}
這是一個簡單的代碼,不會編譯。如果一個人改變了這一點:enable_if如何在這種情況下工作
int main() {
nope();
}
到
int main() {
nope<std::string>();
}
它開始編譯。 問題是爲什麼這個工作像它的工作?更具體地講,爲什麼編譯器告訴我:
呼叫到 '沒了()'
,而不是像
enable_if沒有匹配功能::類型未找到 (這是真的,因爲如果條件不滿足,它確實不存在)?
謝謝。
既然你問爲什麼編譯偏好另一個錯誤信息,你應該用你正在使用的編譯器標記這個問題。 –
你看到的是[SFINAE](http://en.cppreference.com/w/cpp/language/sfinae)。 – HolyBlackCat
GCC和Clang都給出了體面的錯誤消息。 Clang甚至給出了註釋:候選模板被忽略:被'enable_if'[with T = int]禁用,使用enable_if_t = typename enable_if <_Cond, _Tp> :: type;' – NathanOliver