为什么我不能在`std :: initializer_list`中使用引用类型

时间:2016-07-07 23:31:40

标签: c++ oop stl initializer-list

当我尝试为包含引用的成员使用初始化列表时,我收到以下错误:

no matching function for call to ‘std::vector<const Exp&>::vector(<brace-enclosed initializer list>)’

我已经阅读了几篇相关的帖子,但首先,他们似乎得到了一个不同的错误;第二,他们将参考文献的使用限定为“毫无意义”。

如果不进入哲学讨论,我真的很想知道是否有可能使下面的例子有效:

#include <vector>

class Exp {
};

class Integer : public Exp {
public:
  const int value;
  Integer(const int val) : value(val) { }
};

int main() {

  const auto a1 = Integer(1);
  const auto a2 = Integer(2);

  const std::vector<const Exp&> va{a1,a2};
 }

它可能是vector类缺少的构造函数吗?非常感谢!

gcc (Ubuntu 5.3.1-14ubuntu2.1) 5.3.1 20160413

[编辑删除虚假示例]

2 个答案:

答案 0 :(得分:3)

虽然标准中没有明确说明,但是尝试使用标准库容器来存储非对象类型应该被视为未定义的行为。见[container.requirements.general],

p1:“容器是存储其他对象的对象......”

p4:“... X表示包含T类型的对象的容器类......”

等等。

答案 1 :(得分:1)

感谢大家!我现在已经解决了这个问题:

std::array<const std::reference_wrapper<const Exp>, 2> ae{a1,a2};

我需要进行更多调查,但我认为现在可以做我想做的事。