C++ 为什么可以';返回模板中数组的第一个元素吗?

C++ 为什么可以';返回模板中数组的第一个元素吗?,c++,arrays,templates,C++,Arrays,Templates,考虑: #include <iostream> template <typename T> T getArray( T &arr ) { return *arr; } int main() { int a[] = {5, 3, 6}; std::cout << getArray(a); } a的类型是int[3],因此T的类型是int[3]无法从函数返回数组。 在C++11中,可以执行以下操作: template &

考虑:

#include <iostream>

template <typename T> T getArray( T &arr ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}

a
的类型是
int[3]
,因此
T
的类型是
int[3]
无法从函数返回数组。

在C++11中,可以执行以下操作:

template <typename T>
auto getArray(T &arr) -> decltype(*arr)
{ 
    return *arr; 
} 
模板
自动获取阵列(T&arr)->decltype(*arr)
{ 
返回*arr;
} 
或者这个:

// requires <type_traits>

template <typename T>
typename std::remove_extent<T>::type& getArray(T &arr)
{ 
    return *arr; 
} 
//需要
模板
typename std::remove_extent::type&getArray(T&arr)
{ 
返回*arr;
} 
在C++03中,您可以执行此操作,但不同之处在于:

template <typename T>
T getArray(T* arr /* not really an array */)
{ 
    return *arr; 
} 
模板
T getArray(T*arr/*不是真正的数组*/)
{ 
返回*arr;
} 
或:

模板
T getArray(T&arr)[N])
{ 
返回*arr;
} 
试试看

模板
T getArray(T&arr)[N]){
返回*arr;
}

因此
T
是元素的类型,而不是数组。

它甚至不在MSVC++2010 Express上编译。正如我所预料的,这是因为您使用引用作为参数,使用标量作为返回值,并将指针传递给函数调用。我不知道关于模板的确切规则(即,类型是如何确定的),但这些代码必须让编译器非常困惑。下面的代码返回您期望它返回的内容

#include <iostream>

template <typename T> T getArray( T* arr ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}
#包括
模板T getArray(T*arr){
返回*arr;
}
int main(){
int a[]={5,3,6};
你能试试吗

#include <iostream>

template <typename T> T getArray( T arr[] ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}
#包括
模板T getArray(T arr[]{
返回*arr;
}
int main(){
int a[]={5,3,6};

std::cout“它不工作”-你能详细说明一下吗?
a
的类型是
int[3]
,因此
T
的类型是
int[3]“数组不能从函数返回。我认为你应该阅读C和C++关于指针的区别。”Robert Harvey:虽然这个问题没有真正写出,但我认为这是一个有趣的问题,因为它是纯SimaE,在那里你不会期望它。@ MyStudi:我以前没有见过任何VE。问题的反复…仍然没有给编辑问题的机会就结束了。在原始代码中,没有传递到函数的指针,而是对数组的引用。因为这使得
T
成为数组,并且无法返回数组。SFINAE正在禁用该模板。重要的是不要混淆在旧版本中,数组是指针。如果OP想知道如何定义
remove_extent
template struct remove_extent{typedef typename T type;};template struct remove_extent{typedef typename T type;}在我看来,这会产生两个功能不同的函数模板,因为使用decltype的模板将返回一个引用,使用remove_extent的模板将按值返回。我是一个初学者。我知道这些函数应该返回数组中的第一个元素,但我没有得到的是
->decltype(*arr)
size\u t
应该怎么做?@user6607:
decltype
提供表达式的类型。因为
*arr
的类型是
int&
,函数返回
int&
。我们让编译器计算返回的内容。
size\u t
是用于h的无符号整数类型要符合上一个标准,您应该将
iostream.h
更改为
iostream
,并使用名称空间std;
添加行
,或者使用
std::cout
。我在其他代码样式中的响应中没有这样做。
template <typename T, size_t N>
T getArray( T (&arr)[N] ) {
    return *arr;
}
#include <iostream>

template <typename T> T getArray( T* arr ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}
#include <iostream>

template <typename T> T getArray( T arr[] ) {
    return *arr;
}

int main() {

    int a[] = {5, 3, 6};

    std::cout << getArray(a);

}