Почему составные литералы не являются частью C ++ до сих пор?

Я знаю, что C & C ++ — это разные языки, стандартизированные разными комитетами.

Я знаю, что эффективность C, как и прежде, была главной целью при разработке C ++. Итак, я думаю, что если какая-либо функция не повлечет за собой никаких накладных расходов во время выполнения & если это эффективно, то это должно быть добавлено в язык. C99 Стандарт имеет некоторые очень полезные & эффективные функции, и один из них составные литералы. Я читал о литералах компилятора Вот.

Ниже приведена программа, которая показывает использование составных литералов.

#include <stdio.h>

// Structure to represent a 2D point
struct Point
{
int x, y;
};

// Utility function to print a point
void printPoint(struct Point p)
{
printf("%d, %d", p.x, p.y);
}

int main()
{
// Calling printPoint() without creating any temporary
// Point variable in main()
printPoint((struct Point){2, 3});

/*  Without compound literal, above statement would have
been written as
struct Point temp = {2, 3};
printPoint(temp);  */

return 0;
}

Таким образом, из-за использования составных литералов не создается дополнительный объект типа struct Point как уже упоминалось в комментариях. Итак, разве это не эффективно, потому что избегает необходимости дополнительной операции копирования объектов? Итак, почему C ++ до сих пор не поддерживает эту полезную функцию? Есть ли проблемы с составными литералами?

Я знаю, что некоторые компиляторы любят g++ поддержка составных литералов в качестве расширения, но обычно это приводит к непереносимому коду & этот код не соответствует стандарту. Есть ли предложение добавить эту функцию также в C ++? Если C ++ не поддерживает какую-либо функцию C, то должна быть какая-то причина & Я хочу знать эту причину.

0

Решение

Я думаю, что в C ++ нет необходимости в составных литералах, потому что в некотором смысле эта функциональность уже покрыта возможностями ООП (объектами, конструкторами и т. Д.).

Ваша программа может быть просто переписана на C ++ как:

#include <cstdio>

struct Point
{
Point(int x, int y) : x(x), y(y) {}
int x, y;
};

void printPoint(Point p)
{
std::printf("%d, %d", p.x, p.y);
}

int main()
{
printPoint(Point(2, 3)); // passing an anonymous object
}
4

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

Других решений пока нет …