2012-02-24 2 views
2

std::is_assignable 형질을 사용해야했습니다. 가장 오래된 컴파일러 버전에서는 사용할 수 없습니다. 나는 이것을 구현해야했기 때문에 (사실, 일부 interwebs가 엿보는 것을 인정한다.) 이것이 내 구현의 버그이거나 std::is_assignable의 일반적인 문제인지 궁금하다.const 멤버가있는 구조체를 할당 할 수있는 이유는 무엇입니까?

모든

첫째, 이것은 내 테스트 구조체입니다 :

struct Bar { 
    bool const cb; // this should kill the default assignment operator 
    int i; 
}; 

여기 내 stdreplace::is_assignable

template <typename T> struct is_assignable : private std::__sfinae_types { 
    private: 
    template <typename T1> 
     static decltype(std::declval<T1>() = std::declval<T1>(),__one()) test(int); 
    template <typename T1> 
     static __two test(...); 
    public: 
    static bool const value = sizeof(test<T>(0)) == sizeof(__one); 
}; 
그러나

, 그것은 나에게 말한다, Bar가 할당입니다 :

int: 1 
Bar: 1 
int[2]: 0 

문제가 어디에 있습니까?

+0

부울 변수 이름을 예약 키워드 이외의 것으로 변경하려고 시도 했습니까? –

+0

@pwny : 오 오. "Bar"구조체를 직접 입력했기 때문에 * 질문에 오타가 *되었습니다. 나는 ** 고마워 ** 질문을 정정했다! – bitmask

+0

Hehe all good 나는 이것이 이상한 컴파일러 트릭이 아니라는 것을 확실히하고 있었다. –

답변

3

컴파일러가 할당 연산자를 삭제 된 것으로 올바르게 정의하지 않은 것 같습니다. 암시 적으로 선언 된 특수 멤버 함수와 관련된 C++ 03 코드에서 평가되지 않은 피연산자 내에서 그러한 할당은 평가 된 피연산자에서 발생하는 경우 지정이 잘못된 경우에도 괜찮 았습니다. 그 이유는 asignment 연산자가 절대 암시 적으로 정의되지 않기 때문에 암시 적으로 선언되므로 오류가 발생하지 않기 때문입니다.

C++ 11에서 변경되었으므로 할당 연산자가 자동으로 삭제되어야하므로 컴파일러에 문제가있는 것 같습니다.

+0

나는 본다. 나는 더 많은 조사와 다른 시도들이 이전에 비해 덜 감각적 이었기 때문에 많은 것을 의심했다. 나는 버그 보고서를 제출할 것이지만 분명히 그것은 새로운 버전에서 이미 수정되었다. – bitmask

관련 문제