1 2 3 4 5 6 7 8 9 10 11 12 | int main(int argc, char* argv[]) { typename ::std::result_of<decltype(&normal_function)(int)>::type d1; // ok typename ::std::result_of<decltype( normal_function)(int)>::type d2; // compile error auto test1 = &normal_function; // int (*test1)(int) auto test2 = normal_function; // int (*test2)(int) constexpr int test3 = ::std::is_same<int(*)(int), decltype(&normal_function)>::value; constexpr int test4 = ::std::is_same<int(*)(int), decltype( normal_function)>::value; return(0); } | cs |
함수 앞에 & 붙이는 건 무슨 의미인가요?
test3 = 1 이고 test4 = 0 입니다.
auto 에 추론된 타입보니까 둘다 int(*)(int) 이던데 왜 test3 test4 둘 다 1 이 아닌지 이해가 안 가네요;
그리고 왜 ::std::result_of<decltype(normal_function)(int)>::type 가 아닌 ::std::result_of<decltype(&normal_function)(int)>::type 으로 해야 type 이 정의되는 지도 알려주시면 정말 감사하겠습니다 ㅠㅠ
normal_function 은 int normal_function(int) { return(0); } 이렇게 정의되있습니다
이거 파라미터로 넘길때 참조로 받으면 포인터로 decay가 안일어나서 그런거같은데
참조로 받으면 함수포인터가 아니라 걍 저 함수 그 자체라서 약간 달라요 메타함수를 제가 잘 몰라서 자세히는 답 못해드릴듯
헐 저게 돼?
혹시 C에서도 되려나;
2016052. // 오 무슨 말인지 알겠네요
그런데 & 붙인게 함수 그 자체면 ::std::is_same 으로 int(*)(int) 랑 타입 비교할 때 test4 가 1 이 되어야 하는거 아닌가요 ?
템플릿 파라미터는 컴파일 타임에 결정되야 하는데 그냥쓰면 함수의 주소를 몰라서 안 되는 거일 거임
근데 &붙이면 되는 거였네 신기... 왜 되는 거임 이거?
이거 C macro에서도 되려나?
아 제가 조금 착각했음 왜 저걸 파라미터로 봤지
decltype이면 진짜 레퍼런스까지 다 따서 찾아주거든요
반대로 생각하시면되요 &로 명시적으로 포인터를 따서 추론한거는 함수포인터고 명시적으로 포인터를 안딴거는 진짜 함수 그 자체에 대한 타입이고
아는게없어서 진짜 레퍼런스까지 찾아 준다는게 무슨 말인지 모르겠네요 ..
아 그러면 &fn 은 fn 의 주소고 그냥 fn 하면 fn 그 자체라는거군요
그러면 decltype(fn) 하면 추론되는 타입은 뭔가요??
그게 적는 애매한 함수 그 자체에 대한 타입이라 생각하시면 되요 그렇다고 포인터는 아닌
레퍼런스 딴다는건 int x; int& y = x; decltype(y) z = x;하면 z가 x의 레퍼런스로 잡히는 그거요
근데 이건 호출이 아니니까 레퍼런스는 상관이 없겠네요
호출이면 반대로 선언부에 &가 있어야 함수 그 자체에 대한 타입이 잡히고 &가 없으면 포인터로 decay돼서 함수포인터 타입으로 잡힘 ㅋㅋㅋ
오 감사합니다
decltype(normal_function) fn 으로 하니까 fn 의 함수 선언 대신으로 쓸 수 있네요 ㅋㅋㅋ