簡體   English   中英

C ++中的靜態const雙重初始化

[英]static const double initialization in C++

我有一些用“較新”的編譯器構建的舊代碼,並且遇到了一些對我來說沒有意義的靜態const雙重初始化錯誤。 這是我所擁有的:

//header.h

class myclass
{
   private:
      static const double foo = 3.1415;
      static const double bar = 12345.0 * foo;
};

使用gcc版本4.3.3編譯此代碼時-我看到以下錯誤:

 foo cannot appear in a constant-expression

我已經認為這不是靜態初始化順序的失敗,因為我相信固有數據類型具有明確定義的初始化順序-尤其是當它們位於同一類中時。 作為測試,我已經嘗試過static_cast< double >表達式,但這會產生另一個錯誤,指出const表達式中僅允許使用整型強制類型轉換。

constexpr static數據成員如果是整數或枚舉類型,則只能在類定義中的聲明處直接初始化。 必須在源文件中給所有其他數據類型一個單獨的定義,並且只能在該定義上進行初始化。 因此,將您的類定義更改為:

class myclass
{
   private:
      static const double foo;
      static const double bar;
};

並將這些定義完全引入一個.cpp文件中:

const double myclass::foo = 3.1415;
const double myclass::bar = 12345.0 * foo;

如果您可以使用足夠現代的C ++,則可以選擇將類內聲明更改為constexpr

class myclass
{
   private:
      static constexpr double foo = 3.1415;
      static constexpr double bar = 12345.0 * foo;
};

這樣,除非您將它們用作對象而不是值(例如,使用地址),否則它們將不需要在源文件中進行定義。 但是,GCC 4.3.3不支持C ++ 11的該部分。

暫無
暫無

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

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