initializer_list를 사용한 모호한 과부하 해결

Karlis Olte

Visual Studio에서 다음 코드를 테스트하여 "A (double)"를 컴파일하고 인쇄합니다.

#include <iostream>
#include <initializer_list>

struct A {
    A(std::initializer_list<int>) { puts("initializer_list<int>"); }        // (1)
    A(std::initializer_list<float>) { puts("initializer_list<float>"); }    // (2)
    A(double) { puts("A(double)"); }                                        // (3)
};

int main() {
    A var{ 1.1 };   
}

그러나 IntelliSense와 http://ideone.com/ZS1Mcm 은 둘 이상의 생성자 "A :: A"인스턴스가 인수 목록과 일치한다고 말하면서 동의하지 않습니다 (이니셜 라이저 목록 생성자 모두를 의미 함). (1) 또는 (2)가 제거되면 " 'double'에서 'float'로 변환하려면 축소 변환이 필요하므로"코드가 더 이상 컴파일되지 않습니다.

이것은 버그입니까? 동작이 일관되지 않은 것처럼 느껴지지만 VS13과 VS15에서 동일한 동작이 표시되므로 더 많은 것이있을 수 있습니까?

Columbo

코드 형식이 잘못되었습니다. §8.5.4 / (3.6) 적용 :

그렇지 T않고 클래스 유형이면 생성자가 고려됩니다. 적용 가능한 생성자가 열거되고 오버로드 해결 (13.3, 13.3.1.7)을 통해 최상의 생성자가 선택됩니다.

이제 §13.3.3.1.5가

인수가 이니셜 라이저 목록 (8.5.4)이면 표현식이 아니며 매개 변수 유형으로 변환하는 데 특별한 규칙이 적용됩니다. [...] 파라미터 유형 인 경우 std::initializer_list<X>상기 초기화리스트의 모든 요소가 암묵적으로 변환 할 수 X, 암시 적 변환 시퀀스가리스트의 요소를 변환해야 최악 변환 되나X , 또는 초기화리스트에 요소가없는 경우 신원 변환.

변환 1.1타입 인 double(!)로하면 int에서 전환하면서, 전환 순위 부동 적분 변환이다 1.1행은 float또한 전환 순위를 갖는 - 부동 소수점 변환이다.

여기에 이미지 설명 입력

따라서 두 변환 모두 똑같이 좋으며 §13.3.3.2 / (3.1)도 둘 중 하나를 구분할 수 없기 때문에 호출이 모호합니다. 축소는 과부하 해결이 완료 될 때까지 역할을하지 않으므로 후보 세트 또는 선택 프로세스에 영향을 미치지 않습니다. 보다 정확하게는 후보자는 13.3.2 / 3에 설정된 요구 사항을 충족해야합니다.

둘째, F실행 가능한 함수가 되려면 각 인수에 대해 해당 인수를의 해당 매개 변수로 변환 하는 암시 적 변환 시퀀스 (13.3.3.1)가 있어야합니다 F.

제 인용에 도시 된 바와 같이, 그러나, 변환 암시 적 변환 시퀀스 것을 {1.1}행은 std::initializer_list<int>행 최악 변환 되나 1.1int유효한 (기존!)이 하나 - 부동 적분 변환이다.


대신 당신이 전달하는 경우 {1.1f} 또는 변경 initializer_list<float> 에를 <double> 변환으로, 코드가 잘 형성된다 1.1f 하려면 float 신원 변환입니다. 표준은 (3.6)에 해당 예를 제공합니다.

[ :

struct S {
    S(std::initializer_list<double>); // #1
    S(std::initializer_list<int>);    // #2

};
S s1 = { 1.0, 2.0, 3.0 }; // invoke #1

최종 예 ]

더 흥미롭게도

struct S {
    S(std::initializer_list<double>); // #1
    S(std::initializer_list<int>);    // #2

};
S s1 = { 1.f }; // invoke #1 

또한 유효 -에서 변환하기 때문1.f에이double부동 소수점 인 홍보 변환 순위보다 더 승진 순위를 갖는.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

std :: initializer_list 인수를 사용하여 멤버가 아닌 함수 (/ 비 생성자 컨텍스트)에 대한 오버로드 해결

분류에서Dev

{}를 사용한 함수 과부하 해결

분류에서Dev

가변 고차 함수를 사용한 과부하 해결

분류에서Dev

std :: initializer_list를 사용한 이상한 동작 constexpr

분류에서Dev

rvalue initializer_list를 사용한 유형 추론

분류에서Dev

모호한 첨자 오류 사용을 해결하는 방법

분류에서Dev

RSA 암호화를 사용하여 동일한 데이터에 대해 동일한 결과를 얻는 방법

분류에서Dev

RSA 암호화를 사용하여 동일한 데이터에 대해 동일한 결과를 얻는 방법

분류에서Dev

모호한 과부하를 피하기위한 "역 SFINAE"

분류에서Dev

'Const'를 사용한 함수 과부하

분류에서Dev

std :: initializer_list의 요소를 복사해야하는 이유는 무엇입니까?

분류에서Dev

템플릿 매개 변수가 추가 될 때 과부하 해결이 모호한 호출을 생성 함

분류에서Dev

Reduce를 사용하는 내부 제품에 대한 예기치 않은 결과

분류에서Dev

enum을 사용하여 반환 결과 유형을 결정합니다 (Macro를 사용한 해킹).

분류에서Dev

기능 과부하 해결을위한 개념 사용 (SFINAE 대신)

분류에서Dev

bitset과 함께 initializer_list 사용

분류에서Dev

Scala에서 형식 부정에 대해 모호한 암시를 올바르게 사용하는 방법

분류에서Dev

부트 스트랩과 CSS를 사용하는 방법에 대한 오해

분류에서Dev

부울 논리를 사용한 모호한 진실 값

분류에서Dev

data.table 내부에서 고유 한 결과를 사용하는 예기치 않은 결과

분류에서Dev

부모 쿼리의 결과를 사용하는 하위 쿼리

분류에서Dev

BDD / gherkin에서 재사용 가능한 후속 단계에서 결과의 일부를 사용하는 방법

분류에서Dev

분수 (소수점)를 사용하여 부피를 계산하고 필러 프로그램에 대해 이상한 결과를 얻음

분류에서Dev

FiPY를 사용하여 Python에서 복잡한 PDE 해결

분류에서Dev

SFINAE로 과부하 모호성 해결

분류에서Dev

VegaLite / Altair 플롯과의 상호 작용에서 외부에서 신호 / 이벤트를 방출하는 데 대한 해결 방법은 무엇입니까?

분류에서Dev

Java를 사용하여 Wolfram Alpha에서 검색 한 결과에서 필요한 부분 문자열 추출

분류에서Dev

결과를 부여하는 사용자 권한에 대한 기능을 수행합니까?

분류에서Dev

사용자가 API를 호출 할 때 관찰 가능한 배열을 구축하고 모두 해결되면 블록을 실행합니다.

Related 관련 기사

  1. 1

    std :: initializer_list 인수를 사용하여 멤버가 아닌 함수 (/ 비 생성자 컨텍스트)에 대한 오버로드 해결

  2. 2

    {}를 사용한 함수 과부하 해결

  3. 3

    가변 고차 함수를 사용한 과부하 해결

  4. 4

    std :: initializer_list를 사용한 이상한 동작 constexpr

  5. 5

    rvalue initializer_list를 사용한 유형 추론

  6. 6

    모호한 첨자 오류 사용을 해결하는 방법

  7. 7

    RSA 암호화를 사용하여 동일한 데이터에 대해 동일한 결과를 얻는 방법

  8. 8

    RSA 암호화를 사용하여 동일한 데이터에 대해 동일한 결과를 얻는 방법

  9. 9

    모호한 과부하를 피하기위한 "역 SFINAE"

  10. 10

    'Const'를 사용한 함수 과부하

  11. 11

    std :: initializer_list의 요소를 복사해야하는 이유는 무엇입니까?

  12. 12

    템플릿 매개 변수가 추가 될 때 과부하 해결이 모호한 호출을 생성 함

  13. 13

    Reduce를 사용하는 내부 제품에 대한 예기치 않은 결과

  14. 14

    enum을 사용하여 반환 결과 유형을 결정합니다 (Macro를 사용한 해킹).

  15. 15

    기능 과부하 해결을위한 개념 사용 (SFINAE 대신)

  16. 16

    bitset과 함께 initializer_list 사용

  17. 17

    Scala에서 형식 부정에 대해 모호한 암시를 올바르게 사용하는 방법

  18. 18

    부트 스트랩과 CSS를 사용하는 방법에 대한 오해

  19. 19

    부울 논리를 사용한 모호한 진실 값

  20. 20

    data.table 내부에서 고유 한 결과를 사용하는 예기치 않은 결과

  21. 21

    부모 쿼리의 결과를 사용하는 하위 쿼리

  22. 22

    BDD / gherkin에서 재사용 가능한 후속 단계에서 결과의 일부를 사용하는 방법

  23. 23

    분수 (소수점)를 사용하여 부피를 계산하고 필러 프로그램에 대해 이상한 결과를 얻음

  24. 24

    FiPY를 사용하여 Python에서 복잡한 PDE 해결

  25. 25

    SFINAE로 과부하 모호성 해결

  26. 26

    VegaLite / Altair 플롯과의 상호 작용에서 외부에서 신호 / 이벤트를 방출하는 데 대한 해결 방법은 무엇입니까?

  27. 27

    Java를 사용하여 Wolfram Alpha에서 검색 한 결과에서 필요한 부분 문자열 추출

  28. 28

    결과를 부여하는 사용자 권한에 대한 기능을 수행합니까?

  29. 29

    사용자가 API를 호출 할 때 관찰 가능한 배열을 구축하고 모두 해결되면 블록을 실행합니다.

뜨겁다태그

보관