簡體   English   中英

這個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(模板可以與不同的類型名一起使用)和一個來自外部的大小。 然后它返回此大小。

堆棧函數通常使用size ,這是一個整數,用於顯示使用此函數請求的堆棧大小。 &測試堆棧T的大小是什么意思。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM