> 백엔드 개발 > C++ > C 20의 `constexpr` 벡터와 문자열이 일시적인 할당 오류를 일으키는 이유는 무엇입니까?

C 20의 `constexpr` 벡터와 문자열이 일시적인 할당 오류를 일으키는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-03 06:20:14
원래의
372명이 탐색했습니다.

Why Do `constexpr` Vectors and Strings in C  20 Lead to Transient Allocation Errors?

constexpr C 20 벡터 및 문자열: 일시적 할당 딜레마

벡터 및 문자열에 대한 constexpr 지원을 도입하는 C 20 표준에도 불구하고 개발자는 이러한 constexpr 객체를 생성하려고 시도할 때 예기치 않은 컴파일러 오류가 발생합니다.

아래 예에서 컴파일러는 식에 상수 값이 필요함을 나타내는 오류를 발생시킵니다.

#include <vector>
#include <string>

int main()
{
    constexpr std::string cs{ "hello" };
    constexpr std::vector cv{ 1, 2, 3 };
    return 0;
}
로그인 후 복사

Visual Studio 2019 버전 16.11.4는 constexpr 벡터 및 문자열에서 이 문제는 C 20의 constexpr 할당 의미 체계의 제한으로 인해 발생합니다.

달리 constexpr 변수, C 20 constexpr 컨테이너는 임시 할당만 지원합니다. 이는 상수 평가 중에 할당된 메모리가 평가가 끝나기 전에 완전히 해제되어야 함을 의미합니다. 그러나 벡터에는 본질적으로 동적 메모리 할당이 필요하므로 이 요구 사항을 충족하는 데 방해가 됩니다.

결과적으로 벡터 할당이 지속되므로 이 코드는 형식이 잘못된 것으로 간주됩니다.

constexpr std::vector<int> v = {1, 2, 3};
로그인 후 복사

그러나 임시 할당은 constexpr 컨텍스트에서 계속 활용될 수 있습니다. 다음 예를 고려하십시오.

constexpr int f() {
    std::vector<int> v = {1, 2, 3};
    return v.size();
}

static_assert(f() == 3);
로그인 후 복사

이 경우 f()가 반환될 때 메모리가 해제되므로 벡터의 메모리 할당은 일시적입니다. 따라서 할당이 일시적인 경우 constexpr 평가 중에 std::Vectors를 사용하는 것이 허용됩니다.

위 내용은 C 20의 `constexpr` 벡터와 문자열이 일시적인 할당 오류를 일으키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿