Использование составных литералов в C ++ - PullRequest
0 голосов
/ 09 мая 2018

Я хотел бы инициализировать переменную типа Matrix4 с compound literal. Мой конструктор ожидает float*.

Так вот моя строка инициализации:

const Matrix4 Matrix4::identity ( (float[16]) { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } );

Кажется, что это должно работать, но Visual Studio говорит, что это "нестандартное явное преобразование типов". Но я бы хотел сохранить «однострочную инициализацию», кроме случаев, когда действительно есть более удобный способ.

1 Ответ

0 голосов
/ 09 мая 2018

Вы слишком усложнили вопрос из-за несоответствующей детализации статического элемента.Фактически, вопрос может быть легко воспроизведен как:

void foo(float* );

void k() {
    foo((float[4]){1, 2, 3, 4});
}

То, что у вас здесь есть, это «составной литерал», определенный для C99.Стандарт не доступен в C ++, но некоторые компиляторы имеют расширения, которые поддерживают это.Из самого вопроса кажется, что MSVC также поддерживает это расширение - оно упоминает об этом в сообщении - но не разрешает код.Вероятно, есть способ явно включить его в MSVC, но я не эксперт в этом.

Я действительно не вижу причин для написания несоответствующего кода в этом случае, поэтому я бы выступил против этого.

Отвечая на вопрос после редактирования, на самом деле существует несколько способов, как можно добиться однострочного вызова.Можно заставить функцию принимать std::initializer_list<float> для переменного числа аргументов, std::array<float, 16> для фиксированного числа аргументов или gsl::span.

...