为什么std :: array :: size constexpr具有简单类型(int,double,...)但不是std :: vector(GCC)?

时间:2016-04-14 12:37:07

标签: c++ arrays c++11 constexpr

以下代码:

Country countryObj=new Country();
  countryObj.setName("India");
  countryObj.setPopulation(1000000);
  List<String> listOfStates=new ArrayList<String>();
  listOfStates.add("Madhya Pradesh");
  listOfStates.add("Maharastra");
  listOfStates.add("Rajasthan");

  countryObj.setListOfStates(listOfStates);
  Gson gson = new GsonBuilder()
     .serializeNulls()
     .create();

  // convert java object to JSON format,
  // and returned as JSON formatted string
  String json = gson.toJson(countryObj);

...同时使用std::array<int, 4> arr1; std::array<float, arr1.size()> arr2; gcc进行编译,因为std::array::size被视为clang

但以下内容无法使用constexpr(版本5.3.0 20151204)进行编译:

gcc

对我来说,没有理由这样的代码如果第一个有效则无法编译,但由于我没有找到很多帖子,我不知道它是std::array<std::vector<int>, 4> arr1; std::array<std::vector<double>, arr1.size()> arr2; bug还是gcc分机?

来自clang的错误(我真的不明白......):

gcc

1 个答案:

答案 0 :(得分:21)

我认为这与CWG issue 1684有关。以前,constexpr要求包括:

  

constexpr函数所属的类应为文字类型

并且std::array<std::vector<int>, 4> 不是文字类型,因此其size()成员函数不会是constexpr。但是,新的措辞允许非文字类型的constexpr非静态成员函数,假设这些函数满足constexpr的所有其他要求(array<T,N>::size()明确地这样做)。

根据新措辞,这是一个gcc错误。以前以66297提交。