静态初始化包含函数指针的对象的constexpr std :: array

时间:2019-03-08 17:42:26

标签: c++ c++14

我正在尝试使用以下代码静态初始化包含函数指针的对象的constexpr std :: array:

#include <array>

using TVoidVoid = void(*)(void);

class State{
public:
  constexpr State(TVoidVoid function) : function_{function}{}
private:
  TVoidVoid function_;
};

void OnEvent1(){}
void OnEvent2(){}
constexpr std::array<State, 10> states = {{OnEvent1}, {OnEvent2}};

int main(){}

我正在使用:

g++ -Wall -Wextra -Wshadow -Weffc++ -Wstrict-aliasing -ansi -pedantic -Werror -std=c++14 main.cpp

我无法理解我得到的编译错误:

main.cpp:14:69: error: too many initializers for ‘const std::array<State, 10>’
 constexpr std::array<State, 10> states = {{OnEvent1}, {OnEvent2}}

编译器为g ++(Ubuntu 7.3.0-27ubuntu1〜18.04)7.3.0。

这里可能是什么问题?提前非常感谢!

2 个答案:

答案 0 :(得分:2)

错误消息可能会更好。但是实际上,绊倒初始化的是您没有足够的括号。回想一下<input type="radio" name="group1" id="1" class="input-hidden" /> <label for="1"> <img class="wrongAnswer" src="1.jpg"/> </label> <input type="radio" name="group1" id="2" class="input-hidden" /> <label for="2"> <img class="correctAnswer" src="2.jpg"/> </label> <input type="radio" name="group1" id="3" class="input-hidden" /> <label for="3"> <img class="wrongAnswer" src="3.jpg"/> </label>是包装原始数组的聚合。所以您需要这样初始化:

std::array

否则,花括号省略检测算法有些不准确,它假设constexpr std::array<State, 10> states = {{ {OnEvent1}, {OnEvent2} }}; 是要初始化内部数组,而第二个子句是多余的。

现在,您只需要为{OnEvent1}提供默认值,或调整数组大小即可。

答案 1 :(得分:1)

您需要一个默认的构造函数(用于最后8个)

#include <array>

using TVoidVoid = void(*)(void);

class State{
public:
  // This static is equivalent to a TVoidVoid
  // used by the default constructor
  static void DefFunct() {}

  constexpr State(TVoidVoid function) : function_{function}{}

  // We create a default constructor for the 
  // empty elemnts of the array with our function
  constexpr State() : function_(DefFunct) {}

private:
  TVoidVoid function_;
};

void OnEvent1(){}
void OnEvent2(){}
constexpr std::array<State, 10> states = {OnEvent1, OnEvent2};

int main(){}