簡體   English   中英

C ++ 11統一初始化:字段初始化器不是常量

[英]C++11 uniform initialization: Field initializer is not constant

我正在嘗試實例化一組這樣的字符串:

class POI {
public:
...
  static const std::set<std::string> TYPES { "restaurant", "education", "financial", "health", "culture", "other" };
...
}

現在,當我這樣做時,我得到了這些錯誤(全部都在這一行):

error: field initializer is not constant
 static const std::set<std::string> TYPES { "restaurant", "education", "financial", "health", "culture", "other" };
error: in-class initialization of static data member 'const std::set<std::basic_string<char> > POI::TYPES' of non-literal type
error: non-constant in-class initialization invalid for static member 'POI::TYPES'                                                              
error: (an out of class initialization is required)
error: 'POI::TYPES' cannot be initialized by a non-constant expression when being declared

如果我假設集合中的字符串不被視為const,那對我的眼睛來說是有意義的。 這真的是問題嗎? 不幸的是,我找不到在初始化程序中將這些字符串聲明為const的方法。這可能嗎?

您必須在線外初始化靜態變量,如下所示:

#include <set>
#include <string>

class POI {
public:
  static const std::set<std::string> TYPES;
};
const std::set<std::string> POI::TYPES { "restaurant", "education", "financial", "health", "culture", "other" };

這適用於標准規定的整數/枚舉類型(第9.4.2節:)

如果靜態數據成員是const integer或const枚舉類型,則它在類定義中的聲明可以指定一個常量初始化器,它應該是一個整型常量表達式。 在這種情況下,成員可以在其范圍內出現在整數常量表達式中。

C ++中的初始化程序應該是定義的一部分,而不是聲明的一部分。 對於const積分和enum類型,這是放寬的。 在C ++ 11中,為文字類型的 constexpr成員添加了進一步的指令

[class.static.data] / P3

如果非易失性const靜態數據成員是整數或枚舉類型,則它在類定義中的聲明可以指定一個大括號或大小為初始化器,其中作為賦值表達式的每個initializer子句都是一個常量表達式(5.20) )。 可以使用constexpr說明符在類定義中聲明文字類型的靜態數據成員; 如果是這樣,它的聲明應指定一個大括號或等於初始化器,其中作為賦值表達式的每個initializer子句都是一個常量表達式。 [...]如果程序中使用了odr-used(3.2),並且名稱空間范圍定義不包含初始化程序,則仍應在名稱空間作用域中定義該成員

由於它不適用於您的情況,因此您應該將該靜態變量初始化為異常,如本例所示

class POI {
public:
  static const std::set<std::string> TYPES;
};

const std::set<std::string> POI::TYPES = {
   "restaurant", "education", "financial", "health", "culture", "other" 
};

暫無
暫無

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

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