Constexpr 함수의 참조 매개변수에 대한 혼동
아래 코드 조각은 constexpr 함수 내에서 두 개의 바이트 배열을 새 배열로 연결하려고 시도합니다. concatenate라는 이름을 붙였습니다.
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 occurs here // ... }
그러나 Clang으로 컴파일하면 6.0에서 C 17 표준을 사용하면 "비형 템플릿 인수가 상수 표현식이 아닙니다."라는 오류가 발생합니다. 이 오류는 함수 매개변수(data1 및 data2)의 참조 특성으로 인해 발생합니다.
C 표준의 [expr. const]/4:
"e...의 평가가 참조에 다음이 없는 한 참조 유형의 변수 또는 데이터 멤버를 참조하는 id-표현식을 평가하지 않는 한 표현식 e는 핵심 상수 표현식입니다. "
이 경우 참조 매개변수에는 선행 초기화가 없으므로 상수 표현식에서 활용할 수 없습니다.
이 문제를 해결하려면 코드를 다음과 같이 수정하면 됩니다. 참조 매개변수의 size() 멤버 함수에 의존하는 대신 S1 및 S2 템플릿 매개변수를 직접 활용합니다.
std::array<uint8_t, S1 + S2> result;
위 내용은 참조 매개변수가 Constexpr 함수에서 오류를 일으키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!