>백엔드 개발 >C++ >참조 매개변수가 Constexpr 함수에서 오류를 일으키는 이유는 무엇입니까?

참조 매개변수가 Constexpr 함수에서 오류를 일으키는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-15 17:57:15935검색

Why Do Reference Parameters Cause Errors in Constexpr Functions?

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

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