Можно ли инициализировать ссылку на элемент const std::array с помощью rvalue?

Я пытался инициализировать ссылку члена класса const std::array со списком инициализаторов:

class Foo {
    const std::array<const int&, 3> &bar;
    Foo() : bar({ 1, 2, 3 }) {}
}

Но видимо

невозможно инициализировать ссылочный тип 'const std::array &' со списком инициализаторов в скобках

В: Есть ли способ инициализировать элемент ссылки const std::array значением r?


person bur    schedule 17.11.2018    source источник
comment
Временное уничтожается после завершения конструктора. Вам нужно найти другой подход.   -  person HolyBlackCat    schedule 17.11.2018
comment
C++ не имеет специальных правил для std::array.   -  person juanchopanza    schedule 17.11.2018
comment
Спасибо за комментарии, они в значительной степени отвечают на вопрос. Я опубликую свои выводы в качестве ответа.   -  person bur    schedule 17.11.2018
comment
Я также отредактировал вопрос, указав ссылки member.   -  person bur    schedule 17.11.2018
comment
Создание этого Foo f{{1,2,3}}; заставит его работать, но требует, чтобы Foo был агрегированным.   -  person Johannes Schaub - litb    schedule 17.11.2018


Ответы (1)


Из комментариев к вопросу я могу сделать вывод, что не понял двух вещей:

  • const ссылочные элементы отличаются от const ссылочных нечленов в том смысле, что они не продлевают срок службы временных значений.
  • Члены класса могут быть инициализированы в конструкторе с помощью фигурных скобок (где применимо, например, массивы).

В качестве дополнительного примечания член std::array, содержащий T&, может вызвать следующее:

  • #P3#
  • #P4#

В обоих случаях я не совсем уверен, что происходит, но это будут отдельные вопросы.

person bur    schedule 17.11.2018
comment
Ваше предупреждение о невиртуальных деструкторах частично является ссылкой на абстрактные классы С++. - person johnathan; 17.11.2018