C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[74477] Re:C++빌더 tokyo 컴파일러 버그인가요
빌더(TWx) [builder] 3696 읽음    2017-07-15 21:44
질문 님이 쓰신 글 :
: 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로 이용해서 구현되어 있는가 등은 본인이 직접
검증하고 사용하시기 바랍니다.

+ -

관련 글 리스트
74476 C++빌더 tokyo 컴파일러 버그인가요 질문 3460 2017/07/15
74477     Re:C++빌더 tokyo 컴파일러 버그인가요 빌더(TWx) 3696 2017/07/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.