Możliwy błąd kompilatora w MSVC

13

Poniższy kod kompiluje się z gcc i clang (i wieloma innymi kompilatorami 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};
}

podczas kompilacji z (prawie) najnowszym 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

Czy to błąd MSVC? Jeśli tak, który termin w standardzie C ++ najlepiej to opisuje?

Jeśli zamienisz część kodu na

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

i tak kompiluje się płynnie.

Chmura
źródło
Ten linijka może wyjaśnić różnice. Zobacz, na co zwracają się twoje kompilatory std::is_same_v<char, int8_t>. Domyślam się, że jest to implementacja zdefiniowana, czy int8_t jest taki sam jak char, ale trzeba by sprawdzić dokumentację.
zmień igel
Wygląda na to, że może to być błąd. Ten problem został niedawno otwarty i pojawiło się kilka innych raportów.
alteredinstance
1
@alteredinstance Nie rozumiem, w jaki sposób ten problem odnosi się do tego pytania ani jak działa twój poprzedni link. Czy właśnie skopiowałeś pierwszy link podany przez Google dla tego komunikatu o błędzie? Komunikat o błędzie jest bardzo ogólny i może pojawić się w wielu różnych (uzasadnionych) sytuacjach.
orzech
@walnut Wiersz 231 kodu wymienionego w numerze ma niedziałający link do problemu MSVC z agregacją inicjalizacji, to samo robi kod OP. Tak się składa, że ​​biblioteka rozszerzeń napotkała ostatnio podobny problem z używaniem valuew typie agregacyjnym z MSVC
alteredinstance
1
oraz nowy raport o błędzie: developercommunity.visualstudio.com/content/problem/871304/…
marcinj

Odpowiedzi:

8

Powiedziałbym, że MSVC myli się, nie akceptując kodu.

Zgodnie z [dcl.fct.default] / 5 standardowej wersji roboczej C ++ 17 wyszukiwanie nazw w domyślnych argumentach funkcji składowej szablonu klasy odbywa się zgodnie z regułami w [temp.inst].

Zgodnie z [temp.inst] / 2 domyślna instancja szablonu klasy nie powoduje wystąpienia domyślnych argumentów funkcji składowych, a według [temp.inst] / 4 domyślny argument funkcji składowej (nieprecyzyjna specjalizacja a) szablon klasy jest tworzony, gdy jest używany przez wywołanie.

Nie ma wywołania używającego domyślnego argumentu to_datatype<T>::valuew kodzie, dlatego nie należy go tworzyć. Dlatego nie powinno być błędu dotyczącego wyszukiwania valuew to_datatype<char>przypadku niepowodzenia.

(Odpowiednie sekcje w końcowym projekcie standardu C ++ 11 mają równoważne brzmienie, z wyjątkiem numeracji, patrz [decl.fct.default] / 5 , [temp.inst] / 1 i [temp.inst] / 3. )

orzech włoski
źródło