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

时间:2015-03-08 09:16:06

标签: c++ pointers initialization rvalue

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 *,为什么?

3 个答案:

答案 0 :(得分:4)

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

更像是:

T  *left,  right

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

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

答案 1 :(得分:2)

在类型中,*适用于以下内容,因此您应该编码:

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>

答案 2 :(得分:0)

就像这样

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