c ++ 14 — Являются ли составные литералы стандартом C ++?

Составные литералы являются конструкцией C99. Хотя я могу сделать это в C ++:

#include <iostream>
using namespace std;

int main() {
for (auto i : (float[2]) {2.7, 3.1}) cout << i << endl;
}

Кажется, что, например, MSVC поддерживает это как продолжение. Тем не менее, все компиляторы, которые я могу получить, скомпилируют вышеупомянутый код.

Так эта функция доступна в C ++ 14 ? Есть ли другой стандартный термин (мне кажется, что я просто создаю временную инициализацию с использованием фигурных скобок)?


Примечание : «Составные литералы» (или как я бы назвал выше) являются контекст расширения пакета (просто чтобы упомянуть функциональность)

16

Решение

Это расширение, которое как НКУ а также clang служба поддержки. В документе gcc говорится:

В качестве расширения GCC поддерживает составные литералы в режиме C90 и в C ++, хотя семантика в C ++ несколько отличается.

если вы строите с -педантичный вы должны получить предупреждение, например clang говорит (увидеть это в прямом эфире):

предупреждение: составные литералы являются специфической особенностью C99 [-Wc99-extensions]

Обратите внимание, что семантические различия в C ++ не являются незначительными, и код, который будет четко определен в C99, может иметь неопределенное поведение в C ++ с этим расширением:

В C ++ составной литерал обозначает временный объект, который только
живет до конца своего полного самовыражения. В результате четко определены
C-код, который принимает адрес подобъекта составного литерала
быть неопределенным в C ++.

23

Другие решения

(float[2]) {2.7, 3.1}

является составным литералом C99. Некоторые компиляторы поддерживают его в C ++ как расширение.

float[2] {2.7, 3.1}

это синтаксическая ошибка

Дано using arr = float[2];,

arr {2.7, 3.1}

допустим C ++, который инициализирует список временным массивом из двух floats.

{2.7, 3.1}

называется приготовился-INIT-лист.

Наконец, для вашего кода,

for (auto i : {2.7, 3.1}) cout << i << endl;

работает одинаково хорошо и совершенно правильно C ++ — это создает std::initializer_list<double> под капотом. Если вы действительно хотите floats, добавить f суффикс к числам.

22