두 가지 일반적인 유형의 코드가있는 커다란 프로젝트에 많은 코드가 있습니다. 일부는 멋진 C++ 스타일로 작성되었으며 C++의 전문가가 검토 한 코드와 그렇지 않은 코드가 있습니다. 이 아닌 코드 인에는 많은 for 루프와 읽기 및 쓰기로 구성된 검사되지 않은 배열 (힙) 액세스가 있습니다. 다행스럽게도 힙에 대한 이러한 모든 액세스는 클래스를 통해 수행됩니다. 논쟁을 위해, CArray
이라고 부르 자.컴파일 단위에 따라 서로 다른 인라인 멤버 함수가 바이너리 호환성을 손상시킬 수 있습니까?
CArray
은 템플리트 된 이후 완전히 헤더 파일 안에 정의됩니다. (에만 관련 부분을 도시) 다음과 같이 대략적 정의된다
template <typename elementType> class CArray
{
/// Most of class details I'm leaving out
public:
inline elementType & operator[](unsigned int i)
{
#ifdef CARRAY_BOUNDARY_DEBUGGING
if(i >= m_numElements)
{
throw SomeException("CArray::operator[] going out of bounds");
}
#endif
return m_pArray[i];
}
/// also have corresponding const version of this operator[]
private:
elementType *m_pArray;
int m_numElements;
}
(오른쪽 기본적으로 사용자의 가정 생성자, 소멸자, 복사 생성자, 할당 연산자 및 대응 r- 수치 기준 버전 수행한다고 가정 해주세요.
CARRAY_BOUNDARY_DEBUGGING
을 정의한 컴파일 단위 (.cpp
개 파일)가 있고이 클래스 (코드 개선/검토가 필요한 클래스)를 포함하는 질문이 있습니다. 그럴 수 없습니다 (단단한 바위 인 것) :
C++ 03의 컴파일 단위 경계를 넘어서 copy, reference 및 rvalue refrence (C++ 11에만 해당)를 통해 클래스가 전달되는 것이므로 문제가 발생하지 않을까요? C++ 11?
더 좋은 방법이 있습니까?
편집 : 설명. inline
함수가 C++ 03 표준의 3.2 절에 설명 된대로 하나의 정의 규칙을 따라야한다는 것을 알고 있지만 인라인입니다. ODR이 여전히 적용 되나요? 아니면 여기에 효과가 있습니까? 또한 C++ 03 표준에는 "인라인 함수는 사용되는 모든 변환 단위에서 정의되어야합니다."
참고로이 강의는 이보다 더 복잡합니다. 요점을 설명하기 위해 수업을 끝내 었습니다. –
또한 UB라는 표준을 어디에서 지적 할 수 있습니까? 나는 인라인 함수가 하나의 정의 규칙에서 제외되었다고 생각했다. 아니면 다른 것입니까? –
@ChrisA .: ISO/IEC 14882 : 2011 3.2, 단락 5를 참고하십시오. –