2014-11-09 2 views
37

당신이 *declarator*s in §8/4에 대한 문법을 ​​보면 당신은 noptr-declarator이 (ptr-declarator)로 기록 될 수 있다는 것을 알 수 있습니다, 그게이 사람처럼 선언의 유효성을 검사 (declarator-id)로 기록 될 수있다 제목. 사실을 말하자면,이 코드는 문제없이 컴파일 :int (x)와 같은 선언의 목적은 무엇입니까? 또는 int (x) = 10;

#include <iostream> 
struct A{ int i;}; 
int (x) = 100; 
A (a) = {2}; 
int main() 
{ 
    std::cout << x << '\n'; 
    std::cout << a.i << '\n'; 
} 

그러나 (함수 배열 또는까지) 포인터가 선언에 포함되지 않은 경우 이러한 괄호을 허용하는 목적은 무엇인가?

+13

아마도이를 금지하려면 더 복잡한 문법이 필요하기 때문입니다. –

+0

설명이 될 수 있습니다. 나는 이것에 대해 생각하지 않았다. – Mao

+2

마찬가지로, 괄호가 불필요한 경우에도'(42)'는 유효한 표현식입니다. –

답변

52

이 규칙이 귀하의 경우에 적용된다는 사실은 고의적이지 않습니다. 의 결과를 궁극적으로 보았습니다. 귀하의 신고와 같은 신고를 금지 할 인센티브는 없지만, 규칙이 복잡해지면 특히 규칙이 복잡해지면 큰 어려움이 따르게됩니다.

요컨대, 불필요하게 난독 화 된 구문을 사용하지 않으려면하지 마십시오.
C++에서는 읽기 쉬운 코드를 작성하는 일이 거의 없습니다.

std::string foo(); 

namespace detail 
{ 
    int foo(long); // Another foo 

    struct Bar 
    { 
     friend std::string ::foo(); // Doesn't compile for obvious reasons. 

     friend std::string (::foo)(); // Voilà! 
    }; 
} 
+0

'friend std :: string (:: foo)();'선언에 대해 약간 설명 할 수 없습니까? 우리가 실제로 선언 한 것과 그 이유는 무엇입니까? –

+3

@DmitryFucintv : 선언문은 첫 줄에 선언 된'foo'의 인스턴스를'Bar' 구조체의'friend'라고 선언하려고합니다. 함수를 친구로 선언하려면 반환 형식과 인수를 제공해야합니다. 그러나'friend std :: string foo()'는 무의미한 사용 때문에'foo'가 'another''foo'에 의해 숨겨지기 때문에 작동하지 않을 것입니다. 따라서 전역 한정자'::'에 의해'foo'를 한정해야합니다. 그러나 이것은'std :: string'의 (존재하지 않는) 멤버의 지정과 모호함을 겪는 첫 번째 폼을 보여줍니다. ':: foo'를 둘러싼 한 쌍의 괄호는 모호성을 피하는 역할을합니다. –

4

당신은 잘못된 질문을하고 :

는 놀랍게도 괄호는하지만, 하루 저장할 수있는 시나리오가 있습니다. 올바른 질문은 다음과 같습니다.

이러한 선언을 허용하지 않는 이유는 무엇입니까?

대답은 이 없습니다.입니다.

따라서이 구문이 다른 곳에서 규칙의 부작용으로 허용된다는 점을 감안하면 이러한 결과가 발생합니다.

+1

그런 선언을 허용하지 않는 한 가지 이유는 현재'T (x); '문은'T' 유형의 변수'x'의 선언입니다 (그것의 부작용에 대해서만 행해지는)'T'를 입력하는'x'의 함수형 표현식이 아니라, 그것이 어떻게 생겼는지를 보여줍니다. – jchl

+0

@jchl : _ "부작용만으로 완료되었습니다."_ 문제가 있습니다. –