2014-11-10 2 views
9

C++ 11 표준을 살펴 봅니다. 나는 std::tuple_sizestd::tuple_element의 특수화가 volatileconst volatile 튜플에 제공됨을 알 수 있습니다.volatile 및 const volatile std :: tuple 및 std :: get

template <size_t I, class T> class tuple_element<I, volatile T>; 
template <size_t I, class T> class tuple_element<I, const volatile T>; 

template <class T> class tuple_size<volatile T>; 
template <class T> class tuple_size<const volatile T>; 

그러나 std::getvolatile 또는 const volatile 튜플에 대한 더 제공 전문화를하지 않는다.

나는 GCC.4.8.1에 다음 코드를 시도

volatile std::tuple<int, int> a(1, 1); 
std::cout << "a<0>=" << std::get<0>(a) << "\n"; 

내가 얻을 오류 : 그래서 내가 (CONST) 휘발성 튜플을 만들 수 있지만 내가 그들의 요소에 액세스 할 수 없습니다 이해한다면 no matching function for call to 'get(volatile std::tuple<int, int>&)'

.

예상되는 동작입니까, 아니면 감독입니까?

대단히 감사합니다.

+0

GCC 4.9에서는 작동하지 않습니다. – Barry

+0

'const volatile'은 나를 이상한 조합으로 공격합니다. 누구든지 합법적 인 사용에 대해 알고 있습니까? – Cameron

+3

@Cameron 하드웨어 레지스터는 써서는 안되지만 변경 될 수 있습니다. –

답변

4

std::get의 경우뿐만 아니라 relational operators 또는 swap의 경우도 마찬가지입니다. 왜 swap은 휘발성 튜플을 지원하지 않습니까? 왜냐하면 move constructortuple 일 때 휘발성 튜플을 사용하기 때문입니다. assignment operator도 마찬가지입니다. 사실 표준 라이브러리 전체를 고려할 때 휘발성 객체에 대한 오버로드를 제공하는 클래스 나 템플릿은 거의 없습니다 . 표준화 및 구현에 많은 번거 로움이 될 것입니다. 또는 휘발성 클래스 객체를 갖는 것이 무의미한 것으로 간주되었을 수도 있습니다. 두 경우 모두 휘발성 튜플은 현재 사용할 수 없으며 인터페이스의 현재 상태와 관련하여 get 오버로드를 추가하면 일관성이 없습니다.

volatile tuple유형 (객체가 아닌)으로 사용하는 것은 그 자체로 문제가되지 않으며 유용 할 수 있습니다. 표준 라이브러리의 거의 모든 단일 유형 특성이 모든 cv-qualifier에 대해 특수화되어 있다는 사실과이를 지원하는 tuple_elementtuple_size이됩니다.

1


쉽게에 절 17에서 C++ 표준 volatile를 검색하여이를 확인할 수 있습니다. 29 절의 아토믹 (atomics)과 다른 함수 (템플릿)는 휘발성 매개 변수에 과부하가 걸리지 않습니다.

관련 문제