2009-10-20 3 views
4

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

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() ниже, вплоть до одного оператора возврата без «s?»?

struct S { 
    int i, j; 
}; 

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

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

Dang, похоже, ответ будет, нет ... – plong

ответ

7

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

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

+0

Списки инициализаторов: http://en.wikipedia.org/wiki/C%2B%2B0x#Initializer_lists –

+0

+1 И в этом случае синтаксис: 'return {52, 100};' –

+0

+1 @Jerry. Правильно, но это в § 8.5.5/1. Вы пропустили номер. –

4

Не в C++. Но вы можете в 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, он отклонит его.

1

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

+0

Я, хотя это, но теперь я не могу найти его в черновике ... –

+0

@sbi: хотя его не будет в этом году, для всеобщего здравомыслия, вероятно, лучше всего позвонить C++ 0x. Как и следовало ожидать, в качестве префикса «0x» цифра будет шестнадцатеричной. @frieto: вы были правы. Проект, процитированный выше ... –

+0

@ Джерри: Прочитайте мой комментарий по адресу http://stackoverflow.com/questions/1536753/1536779#1536779. – sbi

 Смежные вопросы

  • Нет связанных вопросов^_^