TryMe::arr
는 odr-used하지만 당신은 정의 (see it live) 제공하지 않습니다
constexpr int TryMe::arr[1];
왜 gcc
와 clang
사이의 일치 결과가 있습니까?
는 모든 프로그램이 아닌 모든 인라인 정확히 하나의 정의를 포함해야한다 : ODR 위반하는 disagnostic을 필요로하지 않는 C++ (11)와 C++ 14 표준 초안 (강조 광산)에서 모두 있기 때문이다 해당 프로그램에서 odr- 사용되는 함수 또는 변수. 진단 없음 필요.
우리는 그것을 볼 수 말한다 초안 C++ 11 표준, 섹션 3.2
에서 ODR 사용하는 것이다 : 그것은 미 평가 피연산자 아니라면
식은 가능성 평가 (5 절) 또는 그 서브 표현. 이 잠재적으로 평가되는 표현식으로 나타나는 변수는 이 아닌 경우 표현식 (5.19)에 나타나는 요구 사항을 만족하는 객체이고 lvalue-to-rvalue 변환 (4.1)은 즉시 입니다. 적용된.
TryMe::arr
개체이며 일정한 식에 표시되지만 좌변 투 r- 수치 변환 즉시 TryMe::arr
뿐만 TryMe::arr[0]
인가되지 않는 요건을 충족한다.
결함 리포트 (DR 712)를 통해도가인가 된 이후 C++ (11)에 적용되는 임시 C++ 14 표준에서 업데이트 된 표현 : 이름이 표시
변수 X (xterm)에ex는 x 축에 대해 을 호출하지 않는 상수 표현식 (5.19)을 생성하고 x 값이 0 일 경우 object, ex는 표현식 e의 잠재적 결과 세트 집합의 요소이며, 여기서,363,210 좌변 투 r- 수치 변환 (4.1) E에인가되는, 또는 E는 폐기 치 식
이다 3.2
단락 2
등의 표현 TryMe::arr[0]
의이 기준에 비어 전위 결과 그것은 odr- 사용됩니다.
참고 :이 섹션에 따라 클래스의 외부 정의를 제공해야 9.4.2
[class.static.data] 말한다 (강조 광산) : 문자의
이
정적 데이터 멤버 타입은 constexpr 지정자를 사용하는 클래스 정의에서 선언 할 수 있습니다. 그렇다면 그 선언은 할당 표현식 인 모든 initializer-clause 이 상수 표현식 인 중괄호 또는 동등 초기자를 지정해야한다. [참고 :이 두 경우 모두 에서 회원은 상수 표현에 나타날 수 있습니다. -end 참고] 그 가 초기화
에게 업데이트을 포함하지 않는다 프로그램 및 공간 범위 정의 에서 (3.2) 사용 ODR-이면 부재는 여전히 공간 범위에 정의한다
TC 3.2
에 다음 탄환 추가 defect report 1926 지적 [basic.def.odr] 제 2
- E 배열 피연산자와 첨자 작업 (5.2.1 [expr.sub])의 경우, 세트에는 해당 피연산자가 들어 있습니다.
어떤 배열 첨자 것은 더 이상 ODR 사용하고 그래서 작전 코드가 C++ 1Z에서 잘 형성하고처럼 결함이 보인다 이후는 C++ (14)처럼 보인다 될 것이다 의미 C++과 비교하여 14.
어떤 버전의 clang입니까? –
coliru에있는 것 – Dean
잘 작동합니다. http://coliru.stacked-crooked.com/a/2b319b9351784244'C++ 11 플래그 '를 켜셨습니까? – texasbruce