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

Operator Precedence in Conditional Operator

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

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;
}

所以它基本上是一堆条件运算符,如果为真,则 return 一个值,如果为假,则根本 none 。如果将它们加在一起,则可以确定参数是什么数据类型。

但是,我意识到了一些事情。括号重要吗?我试过像这样在代码周围加上方括号:

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));
}

所以在某种程度上,它首先评估最后一个条件运算符,然后向后运行。但是我还是想不通,也不知道自己理解的对不对。

谁能告诉我这里的运算符优先级是什么,它是如何执行的?谢谢

是的,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;

被解释为

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;

更清楚

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 ) );

bool 的结果为 1char 的结果为 2int 的结果为 3

关于0 + std::is_same<T, ...>::valuestd::is_same<T, ...>::value是一个bool,作为operator+的操作数时,会隐式转换为int 1 true0 false。之后,将加法结果用作条件,并将 bool 转换回 0false 和非零的 true