2011-10-11 70 views

回答

1

在鏈接的評論說:「整數,指針和成員指針模板參數是不是左值」(重點煤礦)。它並不是說名稱整型變量不是左值 - 它們是。

如果有浮點模板參數這樣的事情,那麼它們也不會是左值;但名爲浮點變量仍然會。

1

這與使用int作爲模板參數是一個右值具體相關,但不能將浮點數用作模板參數。

例如。

template <int T> 
struct foo 
{ 
    void f(int&); 
    void f(int&&); 

    void bar() 
    { 
     int x; 
     f(x); // calls first version 
     f(T); // calls second version, despite being "named" 
    } 
}; 

template <float F> // compile error: can't use a float as a template parameter 
struct bad {}; 
1

你是什麼意思的「命名值」? C++中沒有這樣的概念。 變量(不論其類型如何)是一個左值(當在 表達式中使用時)。在大多數情況下,引用類型的東西是 左值,除了數據類型變量以外的東西不是(但我是 肯定有人會發現一些例外);數據類型(整數 或浮點數)與它無關。

有問題的線程正在討論非類型的模板參數。上面的規則 也適用於此處:引用是左值,其他類型不是左值,其他類型是 。由於只有非常有限的非參考類型集可以用作非類型模板參數,所以似乎會出現混淆:特別是 ,整數類型是可以的,但浮點類型不是。 因此,一個模板內,一個浮點參數必須是參考(和 從而左值),積分類型可以是一個值類型(不是 左值)或基準(左值),例如:

template <int N> 
struct A { /* N is not an lvalue */ }; 

template<int& N> 
struct B { /* N is an lvalue */ }; 

template <double N> 
struct C {}; // This is illegal, and shouldn't compile 

template <double& N> 
struct D { /* N is an lvalue */ }; 

這裏的區別不在於N是否具有整型,它是 是否N是一個參考與否。