>백엔드 개발 >C++ >참조 매개변수가 있는 `constexpr` 함수에서 `data1.size()`가 작동하지 않는 이유는 무엇입니까?

참조 매개변수가 있는 `constexpr` 함수에서 `data1.size()`가 작동하지 않는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-29 07:53:13599검색

Why Doesn't `data1.size()` Work in a `constexpr` Function with Reference Parameters?

참조 매개변수가 있는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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