C++11 为什么编译器抱怨可以静态排除的路径(参见下面的代码)?

C++11 为什么编译器抱怨可以静态排除的路径(参见下面的代码)?,c++11,templates,C++11,Templates,对于以下代码,编译器抱怨没有已知的第一个参数从“const char*”到“int”的转换。编译器在调用g时应该知道t是int。因此,对于f(“a”),将不会调用g 有没有一个好的方法来处理这个问题而不导致模板重载 void g(int i) { cout << i << endl; } template <typename T> void f(T t) { if (is_same<T, int>::value) { g(t);

对于以下代码,编译器抱怨
没有已知的第一个参数从“const char*”到“int”的转换。编译器在调用
g
时应该知道
t
int
。因此,对于
f(“a”)
,将不会调用
g

有没有一个好的方法来处理这个问题而不导致模板重载

void g(int i) {
  cout << i << endl;
}

template <typename T>
void f(T t) {
  if (is_same<T, int>::value) {
    g(t);
  }
}

int main() {
        f("a");
        return 0;
}
void g(int i){

cout消除死代码是一种优化,而不是一种语言功能

在C++17中,如果constexpr
满足您的要求,我们将得到
。因为您已经标记了C++11,我假设您不能使用它,明智的选择是专门化您的模板或标记分派

显性专业化

template <typename T>
void f(T t) { }

template <>
void f(int t) { g(t); }
模板
空f(T){}
模板
void f(int t){g(t);}
标签发送

namespace detail {
    template <typename T>
    f(T t, std::false_type) { }

    template <typename T>
    f(T t, std::true_type)
    {
        g(t);
    }
}

template <typename T>
f(T t) { detail::f(t, is_same<T, int>{}); }
名称空间详细信息{
模板
f(T,std::false_type){
模板
f(T,标准::真实类型)
{
g(t);
}
}
模板
f(T T){细节::f(T,是{})}