C++ 为什么会抛出c2109(不是指针或数组类型)

C++ 为什么会抛出c2109(不是指针或数组类型),c++,visual-c++,C++,Visual C++,在这段代码中,我试图推断出T的非泛型类型是什么。现在T是算术型、向量型或向量向量(又名矩阵)。这段代码导致C2109运行时错误,指出数据不是向量/数组或指针,尽管我从未使用向量进行过测试,也不应该首先执行它。即使执行了,随机访问数据元素也是合法的,因为else if语句检查T是否为向量。那么,为什么它会抛出一个错误,而它本来就不应该被执行,而且即使被执行也应该是合法的呢 template <typename T, typename T2> T2 F1(T data) { i

在这段代码中,我试图推断出T的非泛型类型是什么。现在T是算术型、向量型或向量向量(又名矩阵)。这段代码导致C2109运行时错误,指出数据不是向量/数组或指针,尽管我从未使用向量进行过测试,也不应该首先执行它。即使执行了,随机访问数据元素也是合法的,因为else if语句检查T是否为向量。那么,为什么它会抛出一个错误,而它本来就不应该被执行,而且即使被执行也应该是合法的呢

template <typename T, typename T2>
T2 F1(T data)
{

    if (std::is_arithmetic<T>()) {
        std::cout << "Working scalar " << std::endl;
        return data + 1;
    }
    else if (std::is_same<T, std::vector<T2> >()) {
        //Creates C2109
        return data[0] + 1;
    }
    else {
        //Its only matrix in our program

        //Also creates a C2109
        return data[0][0] + 1;
    }
}
template<typename T,typename T2>
T2 taskgraph_sequental(T a)
{
    T2 b = F1<T,T2>(a);
    return b;
}
int main()
{

    //Begin testing with all a inbuilt type 
    int a = 3;
    int val_4 = taskgraph_sequental<int,int>(a);
    std::cout << val_4 << std::endl;
}
模板
t2f1(T数据)
{
if(std::is_算术()){

std::cout您应该使用
if constexpr
在未命中分支时使代码不出错

if constexpr(std::is_arithmetic<T>())
...
else if constexpr(std::is_same<T, std::vector<T2>>())
如果constexpr(std::is_算术())
...
否则如果constexpr(std::is_same())

请始终以表单形式发布代码。很有趣。这是第一次有人这样做,我想知道为什么这不会产生错误,而我的会产生错误。这是因为所有常量都已在编译时进行了计算吗?是否有其他方法可以获得相同的功能?
如果
需要编译其代码的所有分支
if constexpr
知道编译时将采用哪个分支,并且可以丢弃其他分支。因此,
data[0]当
T
对于
if
来说是一个算术类型,而不是
if constexpr
来说是一个问题。始终在控制流语句中声明constexpr总是一个好主意吗?因为这似乎是一个应该始终保持的优化步骤done@Recker12这更多的是关于语义而不是优化。C++dn在开始时并没有常数求值,所以所有代码都会被编译,不管它是否是死分支。只有在C++11
中,如果添加了constexpr
来辅助元编程,我会在任何可能的地方使用它,但那不是很多地方——大多数if都有运行时条件,而不是编译时间。