>백엔드 개발 >C++ >C Union에서 `std::string`을 사용할 수 없는 이유는 무엇입니까?

C Union에서 `std::string`을 사용할 수 없는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-16 17:58:03239검색

Why Can't You Use `std::string` in a C   Union?

컴파일러가 유니온에서 std::string을 허용하지 않는 이유는 무엇입니까?

C로 작업할 때 데이터 구조를 사용해야 하는 경우가 많습니다. 다양한 유형의 데이터를 저장할 수 있습니다. 그러한 구조 중 하나는 여러 변수를 동일한 메모리 위치에 할당하는 공용체입니다. 그러나 Union이 멤버에 대해 갖는 제한과 관련하여 일반적인 질문이 제기됩니다.

중요한 제한 중 하나는 Union에 중요한 복사 생성자가 있는 클래스를 포함할 수 없다는 것입니다. 여기에는 std::string과 같은 클래스가 포함됩니다. 이유를 이해하려면 다음 시나리오를 고려하십시오.

union U {
  std::string x;
  std::vector<int> y;
};

U u; // <--

일반적으로 구조체에서 u.x 또는 u.y를 초기화하면 기본값으로 설정됩니다. 그러나 Union에서는 모든 구성원이 동일한 주소를 공유하므로 데이터를 덮어쓰지 않고는 두 구성원 모두에게 값을 할당할 수 없습니다. 어느 멤버도 초기화되지 않은 경우 이를 사용하면 정의되지 않은 동작이 발생합니다.

C 98에서는 중요하지 않은 생성자가 있는 클래스가 공용체의 멤버가 되는 것을 금지하여 이 문제를 해결했습니다. 구체적으로 §9.5/1에 명시되어 있습니다:

"중요하지 않은 생성자(12.1), 중요하지 않은 복사 생성자(12.8), 중요하지 않은 소멸자(12.4)가 있는 클래스의 객체 또는 중요하지 않은 복사 할당 연산자(13.5.3, 12.8)는 공용체의 구성원이 될 수 없으며 그러한 배열도 될 수 없습니다. 개체."

이 제한은 공용체 내의 데이터 조작을 효과적으로 처리할 수 있도록 보장합니다.

C 0x는 이 규칙을 어느 정도 완화하여(§9.5/2) 최대 하나의 비정적 개체를 허용합니다. 중괄호 또는 같음 초기화가 있는 데이터 멤버입니다. 그러나 공용체에 대해 오류 없는 복사 생성자와 소멸자를 작성하는 것은 여전히 ​​복잡합니다. 이러한 이유로 태그가 지정된 공용체나 Boost::variant 및 Boost::any와 같은 타사 라이브러리는 이기종 데이터 작업을 위한 대체 솔루션을 제공합니다.

위 내용은 C Union에서 `std::string`을 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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