MSVC의 가능한 컴파일러 버그


13

다음 코드는 gcc 및 clang (및 기타 여러 C ++ 11 컴파일러)으로 컴파일됩니다.

#include <stdint.h>

typedef int datatype;

template <typename T>
struct to_datatype {};

template <>
struct to_datatype<int16_t> {
  static constexpr datatype value = 1;
};

template <typename T>
class data {
 public:
  data(datatype dt = to_datatype<T>::value) {}
};

int main() {
  data<char> d{to_datatype<int16_t>::value};
}

(거의) 최신 MSVC로 컴파일 할 때

> cl .\test.cpp /std:c++latest /permissive-
Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
.\test.cpp(16): error C2039: 'value': is not a member of 'to_datatype<T>'
        with
        [
            T=char
        ]
.\test.cpp(16): note: see declaration of 'to_datatype<T>'
        with
        [
            T=char
        ]
.\test.cpp(20): note: see reference to class template instantiation 'data<char>' being compiled

이것은 MSVC의 버그입니까? 그렇다면 C ++ 표준에서 어떤 용어가 가장 잘 묘사됩니까?

코드의 일부를

template <typename T>
class data {
 public:
  data(datatype dt) {}
  data() : data(to_datatype<T>::value) {}
};

어쨌든 부드럽게 컴파일됩니다.


이 원 라이너는 차이점을 설명 할 수 있습니다. 컴파일러가 무엇을 반환하는지 확인하십시오 std::is_same_v<char, int8_t>. 내 생각에 int8_t가 char과 같은지 여부는 정의 된 구현이지만 문서를 확인해야합니다.
alter igel

실제로 버그 일 수 있습니다. 이 문제 는 최근에 열렸으며 몇 가지 다른 보고서가 있습니다.
alteredinstance

1
@alteredinstance 해당 문제가이 질문과 어떻게 관련이 있는지 또는 이전 링크가 그 문제와 어떻게 관련되어 있는지 알 수 없습니다. Google에서이 오류 메시지에 대한 첫 번째 링크를 복사 했습니까? 오류 메시지는 매우 일반적이며 많은 다른 (법적) 상황에서 나타날 수 있습니다.
호두

문제에 언급 된 코드의 @walnut Line 231에는 집계 초기화와 함께 MSVC 문제에 대한 링크가 없습니다 .OP 코드 와 동일합니다. 너무 부스트 라이브러리가 최근 사용하여 비슷한 문제로 실행하는 것을 어떻게 valueMSVC로 집계 유형
alteredinstance

답변:


8

MSVC가 코드를 받아들이지 않는 것이 잘못되었다고 말할 것입니다.

C ++ 17 표준 최종 드래프트의 [dcl.fct.default] / 5 에 따르면 클래스 템플릿의 멤버 함수에 대한 기본 인수의 이름 조회는 [temp.inst]의 규칙에 따라 수행됩니다.

따르면 [temp.inst / 2 클래스 템플릿 암시 실체화 멤버 함수의 기본 인자 인스턴스화 일으키지 않는하고있어서 [temp.inst / 4 의 (비 명백한 특성화 멤버 함수의 기본 인자 a) 클래스 템플릿은 호출에 의해 사용될 때 인스턴스화됩니다.

to_datatype<T>::value코드에서 기본 인수 를 사용하는 호출이 없으므로 인스턴스화해서는 안됩니다. 그러므로의 조회에 대한 오류가 없어야 valueto_datatype<char>실패한다.

(C ++ 11 표준 최종 드래프트의 관련 섹션에는 번호 매기기를 제외하고 동등한 표현이 있습니다 . 대신 [decl.fct.default] / 5 , [temp.inst] / 1[temp.inst] / 3 를 참조하십시오.)

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