C 11에서 클래스 내 초기화 허용: 변경 동기는 무엇입니까?
C 11 이전 시대에는 클래스 내 초기화가 정적 const 멤버로 제한됩니다. 이러한 제한은 다중 번역 단위 시나리오에서 링커 복잡도를 방지해야 하기 때문이었습니다.
그러나 C 11이 도입되면서 이러한 제한이 완화되어 비정적 및 비정적에 대한 클래스 내 초기화가 허용되었습니다. const 멤버(§12.6.2/8).
제한 사항에 대한 원래 이유는 여전히 유효하지만 C 11은 부담을 링커에서 다음으로 옮기는 솔루션을 구현했습니다. 컴파일러. 여러 정의를 허용하는 대신 이제 컴파일러가 초기화를 처리합니다.
중괄호 또는 동등 초기화 장치가 있는 비정적 멤버의 경우 초기화는 8.5에 따라 수행됩니다. 그렇지 않고 변형 멤버(9.5)인 경우 초기화가 발생하지 않습니다. 다른 모든 경우에는 기본 초기화(8.5)가 수행됩니다.
또한 constexpr 지정자로 표시된 비-const 정적 멤버는 이제 클래스 내에서 초기화될 수 있습니다(9.4.2).
이러한 변경으로 인해 코드 유지 관리가 단순화되고 유연성이 향상되지만 프로그래밍 규칙이 약간 복잡해집니다. 예를 들어 멤버에 여러 개의 이니셜라이저가 지정된 경우 초기화된 값은 사용된 생성자에 의해 결정됩니다. 기본 생성자가 호출되는 경우 클래스 내 초기화가 사용됩니다. 기본이 아닌 생성자가 값을 지정하는 경우 클래스 내 이니셜라이저는 무시됩니다.
전체적으로 변경 사항은 링커 안정성을 희생하지 않고 향상된 개발자 인체공학에 대한 강조가 높아진 것을 반영합니다. 이제 컴파일러는 문제를 깔끔하게 분리하면서 이러한 기능을 용이하게 하기 위해 더욱 복잡한 역할을 맡습니다.
위 내용은 C 11이 비정적 멤버에 대해 클래스 내 초기화를 활성화한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!