Я знаю, что 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, то должна быть какая-то причина & Я хочу знать эту причину.
Я думаю, что в 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
}
Других решений пока нет …