为什么这是非法的初始化语法?
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>
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>