#include <cstdio>
template<unsigned N>
int func() {
if(N>100) {
return 1;
} else {
static const char c = N; // g++: error, clang++: pass
static const char s[1] = {N}; // both error
printf("%c\n",c);
return 0;
}
}
int main() {
func<1000>();
return 0;
}
如图程序,为什么会有编译时错误呢?明明走了另一个分支啊!
ringa_lee2017-04-17 13:46:48
這種情況下不是用if
的,要用specialization。與你的程式碼的邏輯等價的語法是:
template<unsigned N>
std::enable_if<(N <= 100), int>::type
func() {
static const char c = N; // g++: error, clang++: pass
static const char s[1] = {N}; // both error
printf("%c\n",c);
return 0;
}
template<unsigned N>
std::enable_if<(N > 100), int>::type
func() {
return 1;
}
這樣才會避免編譯器在重載決議的時候把含有語法錯誤的程式碼加入編譯。