C 객체를 자체 생성자에 전달
C에서는 직관에 어긋나는 것처럼 보일 수 있지만 C 객체를 생성자에 전달하는 것은 실제로 적법합니다. 자신의 생성자. 다음 코드 조각을 고려해보세요.
#include <iostream> struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; int main(int argc, char** argv) { Foo foo(foo); // Surprising, yet valid std::cout << &foo << std::endl; }
이 예에서는 생성된 Foo 객체(&foo)의 주소를 자체 생성자에 전달합니다. 이는 순환 정의와 유사할 수 있지만 C 표준에서는 정의되지 않은 동작으로 간주되지 않습니다.
설명
표준을 사용하면 이전에 초기화되지 않은 개체를 제한된 방식으로 사용할 수 있습니다. 전체 초기화. 특히, 참조를 바인딩하거나 주소를 가져오는 것이 허용됩니다. 이는 C 14 표준 초안의 결함 보고서 363 및 섹션 3.8에 정의되어 있습니다.
이는 위의 코드에서 언어에 의해 설정된 어떠한 제약 조건도 위반하지 않음을 의미합니다. 우리는 단지 표준을 준수하는 방식으로 생성자 내에서 초기화되지 않은 foo 객체를 사용하고 있을 뿐입니다.
Clang의 경고
그러나 일부 컴파일러는 주목할 가치가 있습니다. Clang과 마찬가지로 초기화되지 않은 변수에 대해 경고를 발행할 수 있습니다. 초기화되지 않은 자동 변수에서 불확실한 값을 생성하는 것은 일반적으로 정의되지 않은 동작으로 간주되기 때문입니다. 하지만 이 경우에는 참조만 바인딩하고 생성자 내에서 주소를 가져오기 때문에 불확정성을 도입하지 않습니다.
제한 사항
강조하는 것이 중요합니다. 이 동작은 표준에서 허용되지만 모범 사례로 간주되거나 실제 사용 사례가 있어서는 안 됩니다. 이 토론의 주요 목적은 C 언어 의미론의 잘 알려지지 않은 측면을 조명하는 것입니다.
위 내용은 C 객체를 자체 생성자에 전달할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!