std::common_type implementation

前端 未结 3 786
清歌不尽
清歌不尽 2021-02-20 04:43

Just to see how it worked, I looked at the libstdc++ implementation of std::common_type in the header type_traits. I have to admit that I don\'t really

相关标签:
3条回答
  • 2021-02-20 04:52

    First off, std::declval<T>() yields an r-value of type T. Trying to do anything with the value will fail so it can only be used in an unevaluated context. Next, the ternary operator deduces its type as most specialized type common to both arguments (if there is no such type, it fails). So, the type of the expression

    true? declval<T0>(): declval<T1>()
    

    is the most specialized common type of T0 and T1. All what remains is to turn this expression into a type and making sure that it isn't evaluated. decltype(expr) does just this. Clearly, the two argument version of the beef of the logic: the others are there to deal with the corner case (one argument) and to leverage the two argument version to yield the common type of arbitrary types.

    0 讨论(0)
  • 2021-02-20 04:57

    The third version uses the conditional operator to determine the common type. Its rules are described at quite a length in section 5.16 of the standard, so I'm not sure I should copy them here.

    Simply put, the expression:

    boolean-expression ? second-operand : third-operand
    

    has a "common type" of the second and third operands, if such exists. The decltype specifier is then used to "convert" the expression into a type-specifier.

    0 讨论(0)
  • 2021-02-20 05:02

    Long Story Short: The decltype is making the C++ compiler determine the closest ancestor type for it.

    Tertiary Operator's have the resulting static type of the closest ancestor of the two possible expressions.

    E.g:

    A inherits from B

    X inherits from Y inherits from B

    <expression> ? <expression with static type A> : <expression with static type X> 
        = <expression with static type B>  // this is how the C++ parser sees it
    

    This is how the C++ language works. The decltype just makes the typedef be the static type of the result of that expression (whatever type the C++ compiler determines it to be)

    0 讨论(0)
提交回复
热议问题