条件运算符中的运算符优先级

问题描述 投票:1回答:1

所以我最近正在尝试一些模板,而这正是我偶然发现的代码:

template <typename T>
int someFunction(T someParameter)
{
    return  std::is_same<T, bool>::value ? 1 : 0 +
            std::is_same<T, char>::value ? 2 : 0 +
            std::is_same<T, int>::value  ? 3 : 0;
}

因此,基本上是一堆条件运算符,如果为true,则返回值;如果为false,则根本不返回值。如果将它们加在一起,则可以确定参数是什么数据类型。

但是,我意识到了一些。括号重要吗?我尝试将方括号括在代码中,如下所示:

template <typename T>
int someFunction(T someParameter)
{
    return  (std::is_same<T, bool>::value ? 1 : 0) +
            (std::is_same<T, char>::value ? 2 : 0) +
            (std::is_same<T, int>::value  ? 3 : 0);
}

但是输出仍然相同。所以我在想,也许编译器看到这样的东西:

template <typename T>
int someFunction(T someParameter)
{
    return  std::is_same<T, bool>::value ? 1 : (0 +
            std::is_same<T, char>::value ? 2 : (0 +
            std::is_same<T, int>::value  ? 3 : 0));
}

因此,从某种意义上说,它首先评估最后一个条件运算符,然后向后进行运算。但是我仍然无法解决这个问题,并且不确定我是否正确理解了这一点。

有人可以告诉我这里的运算符优先级是什么,如何执行?谢谢。

c++ operator-precedence conditional-operator
1个回答
1
投票
是,operator+具有比条件运算符高的precedence,所以

return std::is_same<T, bool>::value ? 1 : 0 + std::is_same<T, char>::value ? 2 : 0 + std::is_same<T, int>::value ? 3 : 0;

被解释为
© www.soinside.com 2019 - 2024. All rights reserved.