질문 님이 쓰신 글 :
: extern void validateUser();
:
: template<typename Container, typename Index>
: validateAndAuthor(Container && c, Index i)
: -> decltype(std::forward<Container>(c)[i])
: {
: validateUser();
: return std::forward<Container>(c)[i];
: }
:
: C++빌더 10.2 도쿄로 컴파일 하려는데 에러가 나네요
: 컴파일러 버그인가요
답변:
C++11 랭귀지 파워(type deduction)를 이용해서 템플릿 인자인 Container의 타입에 따라서
lvalue 또는 rvalue 레퍼런스 forwarding을 컴파일러가 추론해서 결정하도록 할 목적으로
템플릿 테크닉(다른 랭귀지는 넘볼 수 없는 C++ template의 강점)을 써서 코드를 구현한 것 같은데...
결론부터 말하면... 위의 코드는 신텍스 자체 부터 잘못 돼 있습니다.
요 며칠전에 설치해본 RAD STUDIO 10.2 Tokyo 컴파일러로 테스트해보니까 C++14도 지원 합디다.
C++ ISO에선 C++1y Language extension 이라는 용어를 사용 하죠.
C++14 랭귀지 파워를 이용하면 아래와 같이 코드를 더 간결하게 작성할 수 있어요.
extern void validateUser();
template<typename Container, typename Index>
decltype(auto) validateAndAuthor(Container && c, Index i)
{
validateUser();
return std::forward<Container>(c)[i];
}
코드가 더 간결하죠?
64비트 컴파일러를 사용하거나, 32비트에선 프로젝트 옵션에서 'Use classic Borland Compier' 설정을 끄고 컴파일 하세요.
(clang 오픈소스 컴파일러를 포팅해서 만든 컴파일러로 컴파일 해야 함)
컴파일러가 C++11 또는 C++14 Language Spec을 지원하더라도 툴에서 제공되는 template 라이브러리 코드가
새로운 랭귀지 Spec을 full로 이용해서 구현 돼 있지 않으면 퍼포먼스 잇점을 얻을 수 없다는 거 절대 잊지 말고요.
constructor 나 assignment 오퍼레이터가 rvalue reference를 지원하도록 구현되어 있는가 등등.
저는 모든 리테일 코드를 Visual Studio 2017로 작성해서 별 걱정없이 프로그래밍 하고 있습니다만...
엠바 컴파일러 template 라이브러리의 안정성이나 랭귀지 Spec을 Full로 이용해서 구현되어 있는가 등은 본인이 직접
검증하고 사용하시기 바랍니다.
|