참조 매개변수가 있는 Constexpr 함수의 상수 표현식
다음 코드 조각을 고려하세요.
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1> &data1, const std::array<uint8_t, S2> &data2) { std::array<uint8_t, data1.size() + data2.size()> result; // Error: non-type template argument is not a constant expression ... }
다음 코드 조각을 고려하세요. -std=c 17을 사용하는 clang 6.0, 함수가 컴파일에 실패함 참조에 적용될 때 배열의 크기 멤버 함수가 constexpr이 아닌 경우.
표준 이론적 근거
이 동작의 이유는 [expr.const]에 설명되어 있습니다. C 표준의 /4:
다음과 같은 표현식은 핵심 상수 표현식이 아닙니다. 다음을 제외하고는 참조 유형의 변수 또는 데이터 멤버를 참조하는 id-expression을 평가합니다.
이 경우 참조 매개변수 data1에는 이전 초기화이므로 상수 표현식 data1.size() data2.size().
해결책
문제를 해결하려면 간단히 교체하면 됩니다. data1.size()와 템플릿 매개변수 S1:
std::array<uint8_t, S1 + S2> result;
위 내용은 참조 매개변수가 있는 `constexpr` 함수에서 `data1.size()`가 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!