다음을 통해 공유


경고 C26445

참조를 할당하거나 std::string_view 참조에 할당 gsl::span 하지 마세요. 생성하기에 저렴하며 기본 데이터의 소유자가 아닙니다. (gsl.view)

참조 또는 gsl::spanstd::string_view 수명 문제의 표시일 수 있습니다.

C++ Core Guidelines

GSL.view: 보기

이 규칙은 표준 컨테이너에서 새 범위 및 뷰 형식으로 마이그레이션된 코드에서 발생할 수 있는 미묘한 수명 문제를 catch합니다. 이러한 형식은 "버퍼에 대한 참조"로 간주될 수 있습니다. 범위 또는 뷰에 대한 참조를 사용하면 추가 간접 참조 계층이 만들어집니다. 이러한 간접 참조는 종종 불필요하며 기본 테인에게 혼란스러울 수 있습니다. 범위는 복사하는 데 저렴하며 함수 호출의 값으로 반환할 수 있습니다. 물론 이러한 호출 결과를 참조해서는 안 됩니다.

설명

  • 규칙은 gsl::span<>, gsl::basic_string_span<> 및 std::basic_string_view<> (인스턴스화에 별칭 포함)에 대한 참조를 검색합니다.
  • 현재 경고는 선언 및 반환 문에서만 내보내집니다. 이 규칙은 나중에 함수 매개 변수에 플래그를 지정하도록 확장될 수 있습니다.
  • 이 규칙의 구현은 간단한 실제 수명을 추적 하려고 하지 않습니다. 참조를 사용하는 것은 일부 시나리오에서 여전히 의미가 있을 수 있습니다. 이러한 경우 가양성도 안전하게 억제할 수 있습니다.

코드 분석 이름: NO_SPAN_REF

예시

임시에 대한 참조:

// Old API - uses string reference to avoid data copy.
const std::string& get_working_directory() noexcept;

// New API - after migration to C++17 it uses string view.
std::string_view get_working_directory() noexcept;

// ...
// Client code which places an explicit reference in a declaration with auto specifier.
const auto &wd = get_working_directory(); // C26445 after API update.