2009-06-21 3 views
4

SFINAE here에 관한 litb의 질문을 읽고 있었는데 그의 코드가 무엇을 선언하고 있는지 궁금합니다. 템플릿이없는 간단한 예제는 다음과 같습니다.이 줄이 함수를 선언합니까? C++

int (&a())[2]; 

정확히 무엇입니까? &의 역할은 무엇입니까? 나는 내가 배열을 반환하는 함수를 선언에 대한 오류를 얻을 수

int b()[2]; 

대신 다음과 같은 선언하는 경우 첫 번째 줄은 그러한 오류가없는 동안, 내 혼란에 추가하려면 (따라서, 하나는 최초의 선언이 생각하는 것 이 아닌). 그러나, 나는 그래서 지금 기능입니다 ... 나는이 기능 A를 할당하려고 해요라는 오류를 얻을

a = a; 

를 할당하려고합니다. 이게 정확히 무엇일까?

+0

나는 어떤 기능이 호출되었는지보기 위해 다소 이상한 구조를 사용했다. sizeof (a())는 sizeof (int [2])를줍니다.다른 함수는 int (& a()) [1]로 선언됩니다. 그 중 하나가 호출되면 sizeof (int [1])를 제공합니다. 어떤 T의 경우 sizeof (T &) == sizeof (T) –

답변

17

cdecl 및 C++ decl라는 멋진 프로그램이 있습니다. 그것들은 복잡한 선언, 특히 C와 C++가 함수 포인터를 위해 사용하는 비잔틴 형식에 유용합니다.

[email protected] ~ $ c++decl 
Type `help' or `?' for help 
c++decl> explain int (&a())[2] 
declare a as function returning reference to array 2 of int 
c++decl> explain int b()[2] 
declare b as function returning array 2 of int 

a는 참조를 반환하고, b는 참조를 반환하지 않습니다.

+0

와우를 사용하면 이러한 프로그램이 유용합니다. Windows 포트가 있다고 가정하지 않습니까? – jalf

+0

Windows 용 cdecl의 표준 버전에 대해서는 잘 모릅니다. 물론 Cygwin을 통해 항상 Linux 버전을 사용할 수 있지만, "cdecl.zip"으로 google을 사용하면 다양한 Windows 포트를 사용하는 것으로 보입니다. 사람들이 해냈습니다. –

+2

그것은 실제로 매우 유용합니다. –

2
int (&a())[2]; 

그것은 인수가없는 정수와의 2 소자 어레이에 대한 참조를 반환하는 함수임을 심볼 a 선언한다.

int b()[2]; 

이는 인수를 취하지 않고 언어의 설계 정수의 2 요소 배열 ... 이것이 불가능을 반환하는 함수는 그 상징 b 선언합니다.

비교적 간단합니다 : 연산자 우선 순위 차트를 얻고 기호 이름 (a)을 시작하고 우선 순위에서 볼 때 연산자를 적용하기 시작하십시오. 각 작업을 적용한 후에 적어 두십시오. 당신이 특히 어려운 C가있을 때

나중에 참조 할 수 있도록
8

, 당신이 도움이 링크를 찾을 수 있습니다/C++ 선언은 해독 :

How To Read C Declarations

완전성, 나는 다른 사람들이 직접 답변을 말한 반복됩니다 문제.

int (&a())[2]; 

... 위의 나는 방법에 대한 명확한 이해가 크기 2의 정수 배열에 대한 참조 (링크 기본 규칙을 읽기를 반환 제로 인수 기능을 할 를 선언 그 내놓았다.)

int b()[2]; 

... B 크기의 두 정수 배열을 반환 제로 인수 함수 것으로 선언한다.

희망이 도움이됩니다.

+1

해당 웹 사이트는 매우 편리합니다. 덕분에 – GRB

+0

C++에서는 배열을 반환하는 함수를 허용하지 않습니다. – fredoverflow

관련 문제