为什么这是非法的初始化语法?

Why is this illegal initialization syntax?

template<typename T>    
void func(T* arr, size_t length)
{
    size_t size_half = length / 2;
    T* left = arr, right = arr + size_half; // Cannot initialize a variable of type 'int' with an rvalue of type 'int *'
}

在我看来,编译器认为正确的类型是 int 而不是 int*,为什么?

会是这样

T *left = arr, *right = arr + size_half;

因为*附在右边,而不是左边。

多看点像:

T  *left,  right

这就是语言语法的定义方式。 您可以通过以下方式修复它:

T *left=...,*right=....;

在类型中,*适用于以下,所以你应该编码:

template<typename T> void func(T* arr, size_t length) {
  size_t size_half = length / 2;
  T *left = arr, 
    *right = arr + size_half; 
  //etc...
}

实际上,我认为你应该每行声明一个指针:

  T *left= arr;
  T *right= arr + size_half;

甚至(C++11 风格):

  T *left {arr};
  T *right {arr + size_half};

  auto left {arr};
  auto right {arr + size_half};

在其行上声明每个指针恕我直言,可读性更高。

顺便说一句,您可以考虑使用 std::array<T>std::vector<T>