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);
}