2017-10-03 1 views
3

와 코드를 고려 할 수 있습니다이유는 템플릿 매개 변수에 의해 친구 기능의 유형을 선언 할 수 있지만 별칭

template <class T> 
class Bar { 
    int foobar; 
    using X = T(); 
    friend X foo; 
}; 

void foo() { 
    Bar<void> bar; 
    bar.foobar = 1; 
    static_cast<void>(bar); 
} 

int main() {} 

gccclang 모두에서 잘 컴파일합니다. 그러나 겉보기에 상응하는 코드는 :

template <class T> 
class Bar { 
    int foobar; 
    friend T foo; 
}; 

void foo() { 
    Bar<void()> bar; 
    bar.foobar = 1; 
    static_cast<void>(bar); 
} 

int main() {} 

gccclang 모두에서 오류가 발생합니다. 템플릿 매개 변수가 별칭과 동등하게 작동하지 않는 이유는 무엇입니까?

+0

'void'를 한 번 보내고 다른 한 건은 void()로 보냅니다. – StoryTeller

+1

"크래시"는 일반적으로 당신이 의미하는 바를 의미하지 않습니다. –

+3

그리고 https://timsong-cpp.github.io/cppwp/temp#spec-7 –

답변

1

T foo은 개체의 선언으로 구문 분석되고 템플릿의 인스턴스화는 개체의 선언을 함수 선언으로 변경할 수 없기 때문에.

C++ 표준/[temp.spec] 함수 선언 함수 선언자의 신택 틱 폼을 사용하지 않고 종속 형 (17.7.2.1)를 통해 그 기능 유형을 취득

경우

, 프로그램은 부적절하다.

+0

네, 친구로서 객체를 선언 할 수는 없지만 이것이 기저에 있다고 생각합니다. 감사! –

+0

예, 정말로 이상합니다. 실제 컴파일러는 친구가 개체가 될 수없고 개체 선언이 함수 선언으로 변형 될 수 없으므로 문제를 예상하고 인스턴스화 전에 버그를보고합니다. – Oliv

관련 문제