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