2012-05-20 3 views
3

두 가지 일반적인 유형의 코드가있는 커다란 프로젝트에 많은 코드가 있습니다. 일부는 멋진 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 개 파일)가 있고이 클래스 (코드 개선/검토가 필요한 클래스)를 포함하는 질문이 있습니다. 그럴 수 없습니다 (단단한 바위 인 것) :

  1. C++ 03의 컴파일 단위 경계를 넘어서 copy, reference 및 rvalue refrence (C++ 11에만 해당)를 통해 클래스가 전달되는 것이므로 문제가 발생하지 않을까요? C++ 11?

  2. 더 좋은 방법이 있습니까?

편집 : 설명. inline 함수가 C++ 03 표준의 3.2 절에 설명 된대로 하나의 정의 규칙을 따라야한다는 것을 알고 있지만 인라인입니다. ODR이 여전히 적용 되나요? 아니면 여기에 효과가 있습니까? 또한 C++ 03 표준에는 "인라인 함수는 사용되는 모든 변환 단위에서 정의되어야합니다."

답변

3

아니요, 괜찮습니다. UB입니다. 인라인 된 정의는 전체 프로그램에서 동일해야합니다. 당신은 당신이 인용 한 문장의 나머지 부분을 읽어 잊었

struct silly_array { 
    T& operator[](int x) { /* unchecked */ } 
    T& at(int x) { /* check bounds */ return (*this)[x]; } 
}; 
+0

참고로이 강의는 이보다 더 복잡합니다. 요점을 설명하기 위해 수업을 끝내 었습니다. –

+0

또한 UB라는 표준을 어디에서 지적 할 수 있습니까? 나는 인라인 함수가 하나의 정의 규칙에서 제외되었다고 생각했다. 아니면 다른 것입니까? –

+0

@ChrisA .: ISO/IEC 14882 : 2011 3.2, 단락 5를 참고하십시오. –

2

: 추가 일부 지역에서 사용되는 논리, 전부는 아니지만을 원한다면, 단지 그것을 (또한 CArray이 바보 쓰기) 다른 회원을합니다. 7.1.2 (4) "인라인 함수는 이 사용되는 모든 번역 단위에서 정의되어야하고 모든 경우에 정확하게 동일한 정의를 갖습니다. (3.2)."