为什么编译器在编译时无法理解if branch的值?

LxL*_*LxL 1 c++ templates c++11

我正在编写一个计算多维向量元素的函数

template<class T>
int real_size(const std::vector<T>& vec)
{
    int size=0;
    for(const auto& v : vec)
    {
        if(std::is_integral<T>::value ||
                std::is_floating_point<T>::value){
            size+=1;
        }
        else{
            size +=real_size(v);
        }
    }
    return size;
}

int main()
{
    std::vector<std::vector<int>> a(10);
    a[0]=std::vector<int>(10);
    std::cout<<real_size(a);
}
Run Code Online (Sandbox Code Playgroud)

哪给我这些错误:

 error: no matching function for call to 'real_size(const int&)'
             size +=real_size(v);
                           ^
Run Code Online (Sandbox Code Playgroud)

这段代码看起来很好,错误也无关紧要...... else语句永远不会成为size +=real_size(int);因为我正在检查模板参数的类型std::is_integer.

但似乎编译器在编译时无法理解它!它是编译器错误还是我犯了错误?

*我正在使用gcc 4.8.1.g ++ -std = c ++ 11*

R. *_*des 8

如果用实际值替换常量,可以看到编译错误是如何产生某种意义的.因为int,该代码等同于以下内容:

    if(true || false){
        size+=1;
    }
    else{
        size +=real_size(v);
    }
Run Code Online (Sandbox Code Playgroud)

这里编译器仍会抱怨else主体无效:死代码仍然必须是有效代码.

  • 找不到什么?那个说整个程序必须格式正确的部分? (8认同)