2016-06-22 2 views
6

그래서 this question에게 물어 보니 static_cast을 통해 해결할 수있었습니다. (덧붙여이 문제를 해결 않습니다, 난 그냥 내가 왜 이해 있는지 확실하지 않습니다.)static_cast <T>은 T &?

코드에서 :

vector<int> foo = {0, 42, 0, 42, 0, 42}; 
replace(begin(foo), end(foo), static_cast<int>(foo.front()), 13); 

단순히 int AN-값 R을 구성하는 static_cast인가?

replace(begin(foo), end(foo), int{foo.front()}, 13); 

편집 : 답변 static_cast에 의해 추론으로

를 구성하는 것 않는 R-값 int : http://ideone.com/dVPIhD

하지만 그 단지 전화의 차이점은 무엇입니까 코드 않습니다 Visual Studio 2015에서 작동합니다.이 컴파일러 버그가 있습니까? 여기에 테스트 : .front()가 축소 변환을 필요로하는 유형을 반환하지 않는 http://webcompiler.cloudapp.net/

+0

위해 나는 나를 백업 표준의 인용문이없는,하지만 난 당신이 기호 대신 참조의 값의 사본을 얻을 수'+ foo.front을()'를 사용 할 수 있다고 생각 – KABoissonneault

답변

6
  1. 예, 그것은, int{...}과 동일합니다. 이 경우 int(...)은 동일합니다.

  2. 프로그래머가 오류가 발생하는 경우 정적 캐스트는 int(...)보다 int로 포인터를 변환하는 것처럼 위험한 일을 거의하지 않을 것입니다. 전방 요소로 정의되지 않은 동작에 주조의 결과를 제거

노트는 대체 동작에 의해 수정되고 그 std::replace을 깰 수있다.

여기

template<class T> 
std::decay_t<T> copy_of(T&& t){return std::forward<T>(t); } 

자신을 사용합니다. 이 MSVC에서 작동하지 않는 이유에 대해서는

...

는 MSVC는 유용하게 당신이 T에 유형 T의 변수를 던져 상황을 소요하고 아무것도하지 않고 진행한다. 이렇게하면 코드가 손상됩니다.

compiler flag (/Zc:rvalueCast)이 있으면 MSVC에서 더 이상 코드를 손상시키지 않을 수 있습니다.

+0

'copy_of' 표준인가요, 아니면 그냥 구현해야한다고 말하고 있습니까? –

+0

@jona 많은 유스 케이스가 있으므로 불필요한 타입 반복을 피하면서 구현할 것을 제안했습니다. – Yakk

+0

그래서 Visual Studio와 gcc의 차이점을 지적하여 질문을 명확히했습니다. 너에 대한 골 포스트를 옮겨서 미안해. –

5

구성원 함수 front은 비어 있지 않은 벡터의 첫 번째 요소에 대한 참조를 반환합니다. 한편

표준 알고리즘은 replace

template <class ForwardIterator, class T> 
    void replace (ForwardIterator first, ForwardIterator last, 
       const T& old_value, const T& new_value) 

같은 선언은 참조에 의해 또한 세번째 파라미터 걸린다. 따라서 일반적으로 벡터의 첫 번째 요소는 알고리즘에 의해 변경 될 수 있으며 알고리즘에 의한 벡터의 다른 요소 처리 결과가 잘못 될 수 있습니다.

static_cast를 사용하면 임시 객체가 만들어지고 알고리즘에 의해 변경되지 않으므로 벡터의 모든 요소 처리가 정확합니다.

나는이 경우에 키워드 auto을 사용하는 C++ 제안을 제안했습니다. 예를

replace(begin(foo), end(foo), auto(foo.front()), 13); 
+1

'자동'제안은 매우 우아합니다. +1 –

+1

자동 제안이 컴파일되지 않습니다. http://coliru.stacked-crooked.com/a/27328ba4ae68d68d – NathanOliver

+1

@ NathanOliver 답변에서 말했듯이, 그것은 단지 제안입니다 – KABoissonneault

관련 문제