Я делаю небольшой класс, который использует массив, построенный на основе его размера. Вот код ...C++ 11 инициализация массива не вызовет конструктор копирования
.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
? Или, может быть, ошибка в моем звоне?
Только в случае, если это поможет, вот моя версия лязг:
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. См. Http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#1467 – dyp
@ dyp Хорошо, спасибо. Означает ли это, что я могу ожидать увидеть исправление в C++ 17? –
Предлагаемая резолюция содержится в последних черновиках, поэтому я ожидаю, что она будет исправлена в следующей редакции стандарта. – dyp