2011-02-08 6 views

답변

7

컴파일러는 현재 C++ 0x WP에 따라 올바르게 작동합니다. 현재 진행중인 this issue report을 참조하십시오.

아마도 최종 C++ 0x Standard는 반환 유형에서 함수 이름 앞에 decltype 응용 프로그램의 의미를 변경하지 않습니다. -> decltype(f(c))을 사용하여 매개 변수 목록 다음으로 이동해야합니다. 최종 C++ 0x에서 올바른 작업을 수행 할 수 있습니다.

+0

C++ 11 *에서는 수정 사항을 통합하므로 올바른 구문 정확성을 얻기 위해 후행 구문을 사용할 수 있습니다. –

0

아니요, decltype은 함수가 const인지 아닌지 여부를 고려하지 않아도됩니다. 같은 다르게 기록 된 수 :

typedef decltype(f(c)) return_type; 

return_type get_c() const { return f(c); } 

수정 : decltype(f(c))도 컴파일하지 말아야 c 정적하지 않기 때문에.

+2

네, 컴파일해야합니다. 평가되지 않은 컨텍스트에서는 비 정적 데이터 멤버에 액세스 할 수 있습니다. –

+0

@ Johannes, 틀렸을 수도 있지만, 비 정적 멤버에 대한 액세스 권한은 함수 본문 내부에서만 허용됩니다. 위의 함수가 후행 반환 유형을 사용하도록 수정 된 경우 비 정적 멤버에 액세스 할 수 있습니다. –

+0

예, 당신이 틀렸다고 생각합니다. 여기에 관련된 질문에 대한 내 대답을 참조하십시오 : http://stackoverflow.com/questions/4849556/does-c0x-allow-decltype-in-function-signature/4850444#4850444 – TonyK

0

f는 lvalue 참조가 아닌 rvalue 참조를 취해야합니다.

0

정상적으로 호출 할 수없는 것에 decltype을 사용할 수 없다고 생각합니다. 나는 당신이 c를 사용할 수있는 곳이 아닌 곳에 decltype 식 내에서도 c에 액세스 할 수있는 표준을 찾을 수 없었다. 당신이 당신의 일을하려는 시점에 this 포인터가 없으므로, 당신이하려는 일을 할 수 있다고 생각하지 않습니다. 그렇게하는 것은 최소한 MSVC 2010에서는 작동하지 않으며 const와는 아무런 관련이 없습니다.

나는 decllu를 사용하여 하나를 얻는 방법을 고려했지만 A가 불완전한 유형이기 때문에 A & & .c에 액세스 할 수 없습니다. 어쨌든 당신이하려고하는 것을 다음과 같은 것 이외에하려고하는 것을 볼 수 없습니다.

decltype(f(declval<C const>())) get_c() const { ... } 
+0

각 텍스트는 5.1.1/10 마지막 글 머리 기호입니다. –

+0

MSVC는 이전 표준 초안에서 작동하기 때문에이 기능이 없습니다. – Puppy