这段c++代码是什么意思?
What does this C++ code mean?
下面的代码返回堆栈分配数组的大小:
template<typename T, int size>
int siz(T (&) [size])
{
return size;
}
但是我无法理解语法。特别是T (&) [size]
部分
但是我无法理解语法。特别是
T (&) [size]
部分…
该部分是对数组的引用。破译任何C和c++都有"左右规则"声明。
因为函数模板从提供的函数实参中推断出模板实参的类型,所以这个函数模板所做的就是推断出数组的类型和元素计数,并返回计数。
函数不能接受数组类型的值,只能接受指针或引用。该引用用于避免将数组隐式转换为指向其第一个元素的指针(即数组衰减):
void foo(int*);
int x[10];
int* p = x; // array decay
foo(x); // array decay again
数组衰减会破坏数组的原始类型,因此数组的大小会丢失。
注意,因为它是c++ 03中的函数调用,所以返回值不是编译时常数(即返回值不能用作模板参数)。在c++ 11中,可以用constexpr
标记函数以返回编译时间常数:
template<typename T, size_t size>
constexpr size_t siz(T(&)[size]) { return size; }
要在c++ 03中将数组元素计数作为编译时常量,可以使用一种稍微不同的形式:
template<class T, size_t size>
char(&siz(T(&)[size]))[size]; // no definition required
int main()
{
int x[10];
cout << sizeof siz(x) << 'n';
double y[sizeof siz(x)]; // use as a compile time constant 10
}
在上面的代码中,它声明了一个函数模板,具有相同的对数组参数的引用,但返回值类型为char(&)[size]
(这是"左右规则"可以欣赏的地方)。注意,函数调用永远不会在运行时发生,这就是为什么函数模板siz
的定义是不必要的。sizeof siz(x)
基本上是在说如果siz(x)
被称为返回值的大小是多少?
旧的C/c++将数组的元素计数作为编译时常量的方法是:
#define SIZ(arr) (sizeof(arr) / sizeof(*(arr)))
T (&) [size]
是对数组的引用。它需要是一个引用,因为下面的程序是不合法的:
#include <iostream>
int sz(int *) { std::cout << "wtf?" << std::endl; return 0; }
int sz(int [4]) { std::cout << "4" << std::endl; return 0; }
int main() {
int test[4];
sz(test);
}
使用
编译程序失败test.cc: In function ‘int sz(int*)’:
test.cc:6:5: error: redefinition of ‘int sz(int*)’
test.cc:3:5: error: ‘int sz(int*)’ previously defined here
因为int sz(int [4])
和int sz(int *)
是一样的。
需要括号来消除这里的歧义,因为T& [size]
看起来像一个引用数组,否则是非法的。
通常情况下,如果参数不是匿名的,你会写:
template<typename T, int size>
int sz(T (&arr) [size])
给数组命名为arr
。在这个实例中,虽然所有示例代码都关心的是推导出的大小,因此匿名参数避免了对未使用参数的警告。
它是一个函数,从外部变成一个typename(模板可以与不同的typename一起使用)和一个大小。然后返回这个大小。
堆栈函数通常使用size
,这是一个整数,它显示了您使用该函数请求的堆栈大小。&
只测试栈T的大小。
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- 表达式"b=(b-x)&x"是什么意思?
- 这个表达是什么意思?
- 此代码验证公式是什么意思?
- 跟踪日志中的T.11803()是什么意思?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- * 和 ** 在 C++ 函数声明中是什么意思?
- _T("xyz")是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 这行代码到底是什么意思?
- 当我们说在执行程序时将操作系统的控制权传递给main()函数时,我们的意思是什么
- 这句话在c++中的意思是什么
- 这个typedef的意思是什么
- 这句话的意思是什么
- 意思是什么
- 这个句法的意思是什么?