내 질문은 배열 참조 매개 변수를 수락하는 두 개의 비 템플릿 함수간에 과부하 해결을 시도하는 매우 간단하고 짧은 코드와 관련이 있습니다. 질문은 다른 곳에 게시되었지만 템플릿 추론 컨텍스트에 게시되었습니다.템플릿이 아닌 컨텍스트에서 배열 참조 매개 변수에 대한 Initializer_list
#include <iostream>
void foo (const int (&x) [3]) { std::cout << "3\n"; }
void foo (const int (&x) [2]) { std::cout << "2\n"; }
int main()
{
foo({1,2,3});
}
그램 ++ 4.8.3 (내 생각)으로 연타 3.4하면서 , 유일한 생존을 첫 번째 기능을 선택이 코드는 foo에 대한 호출이 모호 말하는, 그것을 컴파일되지 않습니다 컴파일 (다음은 코드는 왜?).
옳은 일을하는 컴파일러는 무엇입니까?
clang은 두 번째 오버로드를 제거하는 코드도 컴파일하지 않습니다. initializer_list가 단순히 배열 참조를 초기화하는 것으로 받아 들여지지 않는 것처럼 보입니다.
이 버그가 있습니까?
"그 소리가 코드를 컴파일하지 않습니다와 같은 의미 심지어 두 번째 과부하 제거 "- clang 3.4.2를 사용하여 명령 줄 옵션에'-std = C++ 11 '이 포함되어 있다면 (제 2의 과부하가 제거되면) . 어떤 버전과 호출이 실패합니까? – hvd
맞습니다. 두 번째 오버로드를 제거한 후 플래그 -std = C++ 11을 잊어 버린 코드를 컴파일했습니다. 그 죄송합니다. – GSi
이제 나는이 같은 오류를 피하기 위해 명령 별칭을 정의했다. – GSi