簡體   English   中英

函數模板的C ++奇怪類型轉換錯誤

[英]C++ Weird Type Conversion Error wtih Function Template

我有這些C ++代碼:

在“ header1.h”中

template <typename T>
int  f1(const T& t1) {
    return 0;
}

extern const int  p[];

在cpptests.cpp中

#include "header1.h"
int _tmain(int argc, _TCHAR* argv[])  {
    f1(p);
    return 0;
}

在VC ++ 2010中,出現了此編譯錯誤:

c:\work\cpptests\cpptests\cpptests.cpp(10): error C2664: 'f1' : cannot convert parameter 1 from 'const int []' to 'const int (&)[1]'
          Reason: cannot convert from 'const int []' to 'const int [1]'
          There is no context in which this conversion is possible
  Generating Code...

模板函數調用是否會將p轉換為const int (&)[1]

變量p的類型是“ const int的未知邊界數組”。 根據C ++ 11 8.3.5,“函數”,

如果參數的類型包括形式為“對T的未知邊界數組的引用”的類型,則程序格式錯誤。

請允許我稍微思考一下為什么這很有意義:

您可能知道,即使類型T不完整,類型T *T &都是完整類型。 C ++包含一種奇怪的機制,通過這種機制,變量的類型可以通過完成而改變。 也就是說,您可以聲明變量T x; 類型不完整,但稍后在變量的定義中完成類型。 例如,取T = int[]

extern int a[];    // `a` has incomplete type "array of unknown bound of int"
int a[10];         // now `a` has complete type "array of 10 int"

但是(參見3.9 / 6),現在假設我們還有另一個指針類型T *變量:

int (*p)[] = &a;   // `p` is a pointer to an array of unknown bound

此變量的類型已經完成,但是它的“數組”部分永遠無法完成。 因此,即使a最終可能具有完整的類型,類型p也永遠不會改變。 它的類型永遠不會成為int (*)[10] 兩種類型都已經完成,而后者不是前者的完成。

這意味着您永遠無法使用 p來訪問整個數組對象。 您仍然可以通過將*p衰減為指向數組第一個元素的指針來使用p (請注意*p是一個非常好的lvalue; glvalues不必具有完整的類型),但是您永遠無法通過p看到整個數組。 (相同的理由適用於T & 。)

由於指向未知邊界數組的指針和引用具有這種有限的用途,因此不允許將它們作為函數參數類型使用。 在您的情況下,推導類型恰好是“未知邊界數組”類型,因此生成的程序格式錯誤。

暫無
暫無

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

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