>백엔드 개발 >C++ >참조가 있는 Constexpr 함수의 \'비형 템플릿 인수는 상수 표현식이 아닙니다\' 오류를 어떻게 해결할 수 있습니까?

참조가 있는 Constexpr 함수의 \'비형 템플릿 인수는 상수 표현식이 아닙니다\' 오류를 어떻게 해결할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-04 02:30:09498검색

How Can I Resolve

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.