2014-03-29 35 views
-1

我在閱讀The C++ Programming Language並試圖瞭解Constants。書上說,這是有效的:如何正確地聲明一個常量表達式?

const int dmv = 17; // dmv is a named constant 
constexpr double max1 = 1.4∗square(dmv); // OK if square(17) is a constant expression 

但是當我做:

constexpr double square(double x) 
{ 
    return x * x; 
} 

int main() 
{ 
    const double x = 40.0; 
    constexpr double result = 1.2 + square(x); 
} 

我有兩個錯誤:

  1. 表達必須有一個恆定的值(在x,如果我用的值代替它,如square(12.4)錯誤消失)
  2. 函數調用必須在一個常量表達式恆定值(以平方方法的調用。)

什麼是這些錯誤的原因?我錯過了什麼?

回答

1

在C++ 11之前,constexpr不存在,編譯時算術僅適用於整數類型(或多或少)。

在該語言中,儘可能使const int「變量」真正爲常數,而const double則不然。

C++ 11引入了constexpr,因此const T變量的特殊規則不再必要,但刪除規則將不必要地破壞現有代碼。 C++ 11還引入了編譯時浮點運算,但由於const double變量以前從未被當作常量表達式處理過,而且現在改變它幾乎沒有什麼好處,所以您需要明確說出constexpr

constexpr double square(double x) 
{ 
    return x * x; 
} 

int main() 
{ 
    constexpr double x = 40.0; 
    constexpr double result = 1.2 + square(x); 
} 
+0

我想這before.Still我得到的第二個錯誤:'函數調用必須有一個恆定expression' –

+0

一個恆定值@ Selman22不幸的是,編譯器有漏洞和缺失的功能。在你原來的代碼中,你得到的錯誤是正確的。在這段代碼中,你得到的錯誤是不正確的,這段代碼是有效的。你對icepack的回答評論說你使用的是VS2013,但[VS2013並沒有聲稱正確支持'constexpr'](http://msdn.microsoft.com/en-us/library/hh567368.aspx)。 – hvd

+1

@ Selman22根據[本頁](http://blogs.msdn.com/b/vcblog/archive/2013/12/02/c-11-),最新的CTP部分實現了'constexpr', 14芯的語言的功能,在-VS-2013和 - 所述-NOV-2013-ctp.aspx)。你可以看看你是否在這方面取得更好的結果。 – hvd