Constexpr 함수에서 상수가 아닌 매개변수 참조
다음 함수 템플릿을 고려하세요.
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Error in constexpr contexts due to reference parameter std::array<uint8_t, data1.size() + data2.size()> result; // ... }
Clang 6.0 사용 C 17에서는 이 코드가 "non-type" 오류와 함께 컴파일되지 않습니다. 템플릿 인수는 상수 표현식이 아닙니다." constexpr 함수 내에서 참조를 평가하는 것은 잠재적인 앨리어싱 문제로 인해 문제가 됩니다.
표준 이해
C 표준([expr.const]/4)에 따르면 표현식이 다음과 같은 참조로 평가되는 경우 핵심 상수 표현식이 될 수 없습니다.
해결 방법
이 문제를 해결하려면 문제가 있는 참조 매개변수와 해당 템플릿 매개변수:
template <size_t S1, size_t S2> auto concatenate(const std::array<uint8_t, S1>& data1, const std::array<uint8_t, S2>& data2) { // Problem solved by using S1 + S2 instead std::array<uint8_t, S1 + S2> result; // ... }
템플릿 매개변수를 직접 사용하여 constexpr 컨텍스트에서 참조를 평가하고 함수가 상수 표현식 평가에 사용될 수 있는지 확인해야 합니다.
위 내용은 참조가 있는 Constexpr 함수의 \'비형 템플릿 인수는 상수 표현식이 아닙니다\' 오류를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!