【发布时间】:2015-06-09 00:59:15
【问题描述】:
我正在制作一个小类,它使用一个以其大小为模板的数组。这是一些代码...
.hpp
template <size_t N>
class KeyCombinationListener
{
public:
KeyCombinationListener(
const std::array<sf::Keyboard::Key, N>& sequence,
std::function<void (void)> fn
);
private:
std::array<sf::Keyboard::Key, N> combo;
std::function<void (void)> callback;
};
.cc
template <size_t N>
KeyCombinationListener<N>::KeyCombinationListener(
const array<sf::Keyboard::Key, N>& sequence, function<void (void)> fn
) : combo(sequence), progress{begin(combo)}, callback{fn}
{
}
在构造函数的成员初始化中,我不能使用combo{sequence}作为初始化器,因为它只接受sf::Keyboard::Key类型。如果它要求initializer_list,这是有道理的,但这对我来说似乎很奇怪。对于其他标准容器,我可以使用 {} 表示法调用复制构造函数。这是std::array 的怪癖吗?或者可能是我的 clang 中的一个错误?
以防万一,这是我的 clang 版本:
Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)
Target: x86_64-pc-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9.2
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/4.9.2
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
Candidate multilib: .;@m64
Selected multilib: .;@m64
【问题讨论】:
-
这是
std::array的一个怪癖,也是 C++14 中的一个缺陷。该容器必须是一个聚合容器,并且在 C++14 中使用单个元素进行列表初始化是有缺陷的。见open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#1467 -
@dyp 好的,谢谢。这是否意味着我可以期待在 C++17 中看到修复?
-
建议的决议确实出现在最近的草稿中,所以我希望它会在下一个标准修订版中得到修复。
-
顺便说一句,这与
std::initializer_list无关。这是一个类模板,旨在简化 braced-init-lists 中的某些初始化。后者是{..}初始化构造的语法名称。
标签: c++ c++11 constructor uniform-initialization stdarray