2009-10-20 5 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?"가없는 단일 return 문으로 축소 할 수 있습니까?

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에 입력하십시오. 가장 관련이있는 비트는 BNF에서 'braced-init-list'의 정의입니다 (텍스트의 마지막 비트는 해당 섹션에서 설명한 초기화가 반환 값에 적용될 수 있음을 나타냅니다).

+0

초기화 프로그램 목록 : http://en.wikipedia.org/wiki/C%2B%2B0x#Initializer_lists –

+0

+1이 경우 구문은'return {52, 100}; ' –

+0

+1 @Jerry입니다. 맞습니다. 그러나 §8.5.4/1에 있습니다. 전화 번호를 놓쳤습니다. –

4

C++에는 없습니다.

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하지만 당신은 C99에서, 복합 리터럴 소위 사용 할 수 있습니다 , 12.2]

일부 C++ 컴파일러는 이것을 확장으로 제공하지만 합법적 인 ISO C++ 98이 아닙니다. 예를 들어, g ++는 기본적으로이 코드를 사용하지만, -pedantic 옵션을 사용하여 컴파일하면이를 거부합니다.

1

C++ 1x의 모든 곳에서 브레이스 초기화를 사용할 수 있습니다. (fnieto의 예에서 Comeau 4.3.9 알파 쵸크)

+0

그래도,하지만 지금은 초안에서 찾을 수 없습니다 ... –

+0

@sbi : 올해는 나오지 않지만, 모두의 정 결함을 위해서 C++ 0x라고하는 것이 가장 좋습니다. '0x'를 접두사로 사용하면 예상되는 것처럼 숫자는 16 진수입니다. @frieto : 네가 옳았다. 위에서 인용 한 초안 ... –

+0

@ 제리 : http://stackoverflow.com/questions/1536753/1536779#1536779에서 제 의견을 읽어주십시오. – sbi

관련 문제