T* a, b; b 是 T 而非 T*

在我寫的專案有一條規則是只允許變數宣告一條只能宣告一個。
也就是不能出現類似 T a, b; 這樣的情形
一定要改寫成 T a; T b;
背後的原因則是,T* a, b; 這樣的情形 → a 會是 T*b 則是 T
如果有另一個 pointer<T> = T* 來使用 pointer<T> a, b; 兩者皆會是 T*
所以避免搞混或者要花心力去判別是哪一種狀況,我們就直接規定一條只能宣告一個。

#include <type_traits>
#include <iostream>

template <typename T>
using pointer = T*;

int main (){
    float* a, b; // a is float*, but b is float
    pointer<float> pa, pb; // pa, pb are pointer<float> = float*
    std::cout << "a is float*: " 
        << std::is_same<decltype(a), float*>::value 
        << std::endl;
    std::cout << "b is not float*: " 
        << std::is_same<decltype(b), float*>::value 
        << std::endl;
    std::cout << "pa is float*: " 
        << std::is_same<decltype(pa), float*>::value 
        << std::endl;
    std::cout << "pb is float*: " 
        << std::is_same<decltype(pb), float*>::value 
        << std::endl;
    return 0;
}

例子中,只有 bfloat 其餘就都是 float*
可以用 Compiler Explorer 直接查看上方例子