이것은 다소 까다로운 질문이며 VisualStudio가 맞고 Comeau가 잘못되었다는 것입니다 (믿을 수 없을 것 같습니다).
워드 의해 판독 워드 경우 표준 (인용 참조) 복사 생성자의 관점에서 그 벡터 생성자를 정의하고, 그것이 사실상 반복자 비 참조하여 얻어지는 객체가 제 타입 T로 변환되어야 함을 의미 복사 생성자를 호출해야합니다. 이 시점에서 명시 적 생성자를 사용하면 코드가 컴파일되지 않아야합니다.
한편 구현에서는 역 참조 된 반복자를 인수로 취하는 생성자를 직접 호출해야합니다.이 경우 생성자 호출이 명시 적이며 코드가 컴파일되어야합니다.이것은 복사 생성자이 T 유형의 객체에 대해 단일 상수 참조를 취하는 생성자로 지정된 유형 T에 대해 정의되어 있기 때문에 아래의 인용문에 정확히 어긋납니다.
생각할 수 없습니다. Comeau 접근법을 사용하지 않는 합리적인 주장과 나의 믿음 (이것은 단지 개인적인 견해이다)은 벡터 생성자의 복잡성에 관한 표준의 표현이 을 필요로하는 것으로 재 작성되어야한다고 N은 적절한 T 생성자은 적절한 경우 T(*first)
호출과 일치하는 생성자 (즉, InputIterator::value_type
(값 또는 가능한 경우 상수 참조)를 사용하는 생성자이거나 T 복사 const T. ructor에 InputIterator::value_type
에서 암시 적 변환 후
23.2.4.1은 [lib.vector.cons]/1
복잡성 : 생성자 템플릿 벡터 (제 Input Iterator와 , Input Iterator와 마지막) 만 N하게 T 의 복사 생성자 (N은 첫 번째와 마지막 사이의 거리 임)에 대한 호출이며 반복자가 처음이고 마지막이 전달, 양방향 또는 임의 액세스 범주 인 경우 다시 할당하지 않습니다. 그것은 을 단지 입력 반복자 인 경우 T 복사 생성자에 대한 호출 N 을 호출하고 로그 N 재 할당을 수행합니다.
나는 VS 컴파일러는 주어진 다르게 동작 할 때 방법을 알고 싶습니다 g으로
struct T1;
struct T2 {
operator T1();
};
struct T1 {
T1(T2 const &) { std::cout << "T1(T2)" << std::endl; }
};
T2::operator T1() {
std::cout << "T2::operator T1" << std::endl;
return T1(*this);
}
int main() {
std::vector<T2> v2;
v2.push_back(T2());
std::vector<T1> v1(v2.begin(), v2.end());
}
++ 결과가 T2::operator T1
가 호출되지 않는 것입니다, 오히려 v1
의 요소가의 요소에서 직접 구성된다 v2
. 나는 VS에서 컴파일러가 T2::operator T1
을 사용하여 v2
의 각 요소를 T1 요소로 변환 한 다음 복사 생성자를 호출한다고 가정합니다. 그래?
간접적으로 여기에 답하십시오 : http://stackoverflow.com/questions/1943228/implicit-constructor-conversion-works-on-explicit-vectorvector-only-sometimes –
방금 그 질문 + 답을 바탕으로 대답을 작성했습니다. 'std :: vector :: iterator'는 정수형이 아니기 때문에 fill-constructor가 호출되지 않기 때문에 실제로 적용되지 않습니다. 그래서 나는 그것을 삭제했다. 모든 컨테이너 생성자에서 표준은 * 명시 적 변환을 금지하지 않는다고 말할 수 있습니다. –
Potatoswatter
VS 2010 Beta는 Comeau 및 gcc로 작동합니다. –