int (0)에서 벡터의 포인터로의 암시 적 변환을 피하는 방법


9

JSON에서 키에 대한 경로의 모든 노드 이름을 수집하려는 상황이 있습니다. 배열 인덱스 "0"의 조건, "1"도 허용되지만 인용 부호를 잊어 버리기 쉬워 역 참조시 충돌이 발생할 수 있습니다. 그래서 이것을 거부하고 싶습니다. 예:

#include <vector>
#include <iostream>

int func(const std::vector<const char*>& pin) {
    return pin.size();
}

int main() {
    // {"aname", "3", "path", "0"} wanted but this still compile
    std::cout << func({"aname", "3", "path", 0}) << std::endl;
}

나는 이것을 발견하고 시도했다 . 비 구성 함수에서 암시 적 변환을 피하는 방법은 무엇입니까? 다음과 같이 :

#include <vector>
#include <iostream>

int func(const std::vector<const char*>& pin) {
    return pin.size();
}

template<typename T>
int func(T pin) = delete;

int main() {
    std::cout << func({"aname", "3", "path", 0}) << std::endl;
}

그러나 컴파일러는 여전히 나를 이해하지 못했습니다.

어떠한 제안?
용어 및 가정의 오용을 지적하십시오. 감사합니다!


std::vector<const char*>대신에 사용하는 이유 가 std::vector<std::string>>있습니까?
bolov

nullptr또한 금지하고 싶 습니까?
Jarod42

@bolov 처음에는 이러한 노드 이름을 C 스타일 char *를 입력으로 사용하는 JSON 분석 인터페이스로 전달하는 것을 고려하지만 여기에 국한되지는 않습니다. 나는 std :: vector <std :: string >>을 사용하여 컴파일 할 때 여전히 0을 허용하지만 내 컴퓨터에서 실행시 충돌합니다.
rustyhu

@ Jarod42 네, C 스타일 문자열 리터럴이 원하는 것은 무엇입니까?
rustyhu

답변:


9

이 같은? 제안한 과부하 솔루션과 매우 유사하지만 벡터 유형을 래핑해야합니다. 0삭제 된 생성자 오버로드가 선택 되어 리터럴을 제공하면 빌드에 실패합니다 .

#include <memory>
#include <new>
#include <vector>
#include <iostream>
using std::vector;

template<typename T>
struct no_zero {
        no_zero(T val) : val(val) {}
        no_zero(int val) = delete;
        operator T() { return val; }
        T val;
};

int func(const vector<no_zero<const char*> >& pin) {
    return pin.size();
}

int main() {
    // {"aname", "3", "path", "0"} wanted but this still compile
    std::cout << func({"aname", "3", "path", 0}) << std::endl;
}

4

가늠자에 따르면 C ++의 많은 암시 적 변환은 불행한 일입니다.

고려해야 할 한 가지 옵션은 -Wzero-as-null-pointer-constantgcc 및 clang입니다. 이것이 표준 프로그램의 동작을 변경하고 전 세계적으로 활성화 된 경우 의도하지 않은 영향을 줄 수 있으므로주의하십시오.

g ++-0에서 포인터 유형으로의 암시 적 변환을 어떻게 비활성화합니까?

어떤 Clang 경고가 GCC의 Null-as-Null 포인터 상수에 해당합니까?


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.