그래서 doctest 라이브러리를 작성 중이므로 경고 메시지가 표시됩니다.int와 unsigned에 대한 참조를 비교할 때 경고하지만 const (no ref)와 g ++/msvc를 비교하는 경우 경고가 표시되지 않습니다.
경고없이 if
문에 들어간 코드가 내 CHECK()
매크로 안에 쓰여질 때 문제를 일으키는 것으로 나타났습니다.
예 : if(0u == 0)
은 경고를 표시하지 않지만 CHECK(0u == 0);
은 경고를 발생시키지 않습니다.
조금만 조사했는데 CHECK()
매크로 뒤에는 템플릿 및 표현 분해 및 const 참조로 캡쳐가 있습니다.
내 질문은 3입니다 :이 3 개 조각을 감안할 때
- - 왜 이런 일이 발생 하는가?
const int& a = 0; const unsigned& b = 0; if(a == b)
-
을 :
const int a = 0; const unsigned b = 0; if(a == b)
경고를 제공합니다
int a = 0; unsigned b = 0; if(a == b)
가 경고를하지 않습니다
는 경고를 표시합니다
- 어떻게이 문제를 해결할 수 있습니까? 분명히 라이브러리 헤더의 템플릿 주위에
#pragma diagnostic
을 사용할 수 있으며 이러한 경고는 사라지지만 올바르지 않습니다.int a = 0; unsigned b = 0; CHECK(a == b);
int a = 0; unsigned b = 0; if(a == b)
다음 코드의 다음 조각은 또한 경고를해야한다 :
그 이유는 다음과 같은 코드가 경고를 제공하는 경우이다 >
- const noref 경우에 대해 내가 빠뜨린 것이 있습니까? 어제 나는 this라는 질문을 게시 한 것이 현저히 비슷해 보인다. 내 템플릿의 const 참조에 의해 캡처되기 때문에 엉덩이에 나를 물린 다른 사례가 있습니까?
나는 문제 컴파일러 또는 최적화 수준을 생각하지 않는다 - 나는 약간 (MSVC에 대한 /W4
와 g에 대한 -Wall -Wextra -pedantic
+ 50 more ++)/MSVC++ g의 버전을 시도하고 아마 그 소리는 동일하지 ...
편집 : 다음 코드는 g와 경고를 생산 ++하지만 MSVC로하지 않았다
(-Wsign-conversion
)
const int a = -1;
const unsigned b = 0;
if(a == b)
필자는 여전히 컴파일러 작성자의 추론에 동의하지 않더라도 답변을 수락하기로 결정했으며이 답변이 마음에 들지 않습니다. – onqtam