함수에서 remove_reference가 작동하지 않는 이유는 무엇입니까?


38

다른 날 템플릿 메타 프로그래밍을 할 때 이상한 일이 발생했습니다. 기본적 으로이 주장은 (내가 예상 한대로) 지나치지 않습니다.

static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>);

처음에는 함수 참조를 정의하는 구문 오류가 있다고 생각했지만이 주장은 통과하여 그렇지 않습니다.

static_assert(std::is_same_v<void()&, void()&>);

또한 remove_referencecppreference에서 소스를 복사하여 직접 구현하려고 시도했지만 작동하지 않았습니다. 무슨 일이야?

답변:


42

가증 한 기능 유형의 세계에 오신 것을 환영합니다.

void() &에 대한 참조 가 아닙니다void() . 방법은 그 것 철자 void(&)()(당신이 경우 어느 remove_reference_t, 다시 얻을 것 void()-입니다 remove_reference_t 않습니다 당신이 실제로 기능 유형에 대한 참조입니다 제공 어떤 경우, 함수에 대한 참조에 대한 작업을).

어떤 void() &사실을 의미하는 것은 당신이 클래스를 벗겨 후 참조 자격을 갖춘 멤버 함수의 유형입니다. 그건:

struct C {
    void f() &;
};

의 유형은 &C::f입니다 void (C::*)() &. 그러나 멤버에 대한 모든 포인터 T C::*는 일부 유형에 대해 작성 될 수 있으며이 T경우 유형 T은 다음과 같습니다 void() &.

P0172 도 참조하십시오 .


3
가증 한 함수 유형에 대한 정식 질문을 작성해야합니다.
브라이언

와우, C ++은 거의 10 년 동안 배우고 사용해도 놀라지 않을 것입니다.
Kelvin Hu

13

가지고있는 유형은 함수에 대한 참조 가 아니라 참조 한정자가 있는 함수입니다 .

static_assert(std::is_same_v<void()&, void()&>);
static_assert(!std::is_same_v<void()&, void(&)()>);
static_assert(std::is_same_v<void(&)(), void(&)()>);
static_assert(std::is_same_v<void(), std::remove_reference_t<void(&)()>>);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.