Могу ли я создать анонимный агрегат, инициализируемый скобками, на C++?

Можно создать анонимный объект, который инициализируется с помощью параметров конструктора, например, в операторе return ниже.

struct S {
  S(int i_, int j_) : i(i_), j(j_) { }
  int i, j;
};

S f()
{
  return S(52, 100);
}

int main()
{
  cout << f().i << endl;
  return 0;
}

Однако можно ли аналогичным образом создать анонимный агрегат, который инициализируется с помощью инициализатора фигурной скобки? Например, можно ли свернуть тело f(), приведенное ниже, до одного оператора return без «s?»

struct S {
  int i, j;
};

S f()
{
  S s = { 52, 100 };
  return s;
}

int main()
{
  cout << f().i << endl;
  return 0;
}

person plong    schedule 20.10.2009    source источник
comment
Черт, похоже ответ будет, нет...   -  person plong    schedule 20.10.2009


Ответы (3)


Вы не можете в текущей версии C++. Вы сможете это сделать в C++ 0x - я все равно верю. Конечно, он все еще открыт для пересмотра — одно время я полагал, что вы сможете указывать концепции в C++ 0x, но этого больше нет...

Изменить: ссылка будет [dcl.init] (§8.5/1) в N2960. Наиболее важным битом является определение 'braced-init-list' в BNF (и последний бит текста, говорящий о том, что инициализация, описанная в этом разделе, может/применяется к возвращаемым значениям).

person Jerry Coffin    schedule 20.10.2009
comment
+1 @Джерри. Верно, но это в §8.5.4/1. Вы пропустили номер. - person fnieto - Fernando Nieto; 21.10.2009
comment
§8.5/1 был частью, на которую я смотрел (и дает достаточно, чтобы ответить на текущий вопрос). Однако вы правы в том, что §8.5.4/1 касается именно списков инициализаторов в фигурных скобках, и в нем содержится гораздо больше подробностей о них. - person Jerry Coffin; 21.10.2009

Не в С++. Но вы можете это сделать в C99, используя так называемые составные литералы:

struct S {
  int i, j;
};

struct S F()
{
  // Valid C99, invalid C++:
  return (struct S){ 52, 100 };
}

[C99: §6.5.2, 6.5.2.5]
[C++98: §5.2.3, 8.5, 12.1, 12.2]

Некоторые компиляторы C++ предоставляют это как расширение, но это недопустимо в ISO C++98. Например, g++ примет этот код по умолчанию, но если вы скомпилируете его с параметром -pedantic, он его отклонит.

person Adam Rosenfield    schedule 20.10.2009

Вы сможете использовать инициализацию фигурных скобок практически везде в C++1x. (Хотя Comeau 4.3.9 alpha задыхается от примера fnieto.)

person sbi    schedule 20.10.2009
comment
@sbi: даже если он не выйдет в этом году, ради всеобщего здравомыслия, вероятно, лучше все же называть его C++ 0x. Как и следовало ожидать, с префиксом «0x» цифра будет шестнадцатеричной. @frieto: ты был прав. Приведенный выше проект... - person Jerry Coffin; 21.10.2009
comment
@Jerry: Пожалуйста, прочитайте мой комментарий по адресу stackoverflow.com/questions/1536753/1536779#1536779. - person sbi; 21.10.2009