Possibile bug del compilatore in MSVC


13

Il codice seguente viene compilato con gcc e clang (e molti altri compilatori 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};
}

quando compilato con (quasi) l'ultimo 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

È un bug di MSVC? Se sì, quale termine nello standard C ++ lo descrive meglio?

Se si sostituisce parte del codice con

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

si compila comunque senza problemi.


Questo one-liner potrebbe spiegare le differenze. Scopri cosa restituiscono i tuoi compilatori std::is_same_v<char, int8_t>. La mia ipotesi sarebbe che è l'implementazione definita se int8_t è uguale a char, ma si dovrebbe controllare la documentazione.
alter igel

Sembra che in realtà potrebbe essere un bug. Questo problema è stato aperto di recente e ci sono stati molti altri rapporti.
alteredinstance

1
@alteredinstance Non vedo come questo problema si collega a questa domanda, o come fa il tuo link precedente, del resto. Hai appena copiato il primo link fornito da Google per questo messaggio di errore? Il messaggio di errore è molto generico e può apparire in diverse situazioni (legittime).
noce,

@walnut La linea 231 del codice menzionato nel problema ha un collegamento defunto a un problema MSVC con inizializzazione aggregata, la stessa cosa che sta facendo il codice OP. Accade solo che recentemente la libreria boost ha value
riscontrato

Risposte:


8

Direi che MSVC ha torto a non accettare il codice.

Secondo [dcl.fct.default] / 5 della bozza finale standard C ++ 17, la ricerca del nome negli argomenti predefiniti di una funzione membro di un modello di classe viene eseguita in base alle regole in [temp.inst].

Secondo [temp.inst] / 2 l' istanza implicita di un modello di classe non provoca l'istanza di argomenti predefiniti delle funzioni membro e secondo [temp.inst] / 4 un argomento predefinito per una funzione membro di una (specializzazione non esplicita di a) il modello di classe viene istanziato quando viene utilizzato da una chiamata.

Non vi è alcuna chiamata utilizzando l'argomento predefinito to_datatype<T>::valuenel codice e quindi non deve essere istanziato. Quindi non ci dovrebbe essere un errore relativo a Ricerca di valuein to_datatype<char>fallimento.

(Le sezioni pertinenti nella bozza finale standard C ++ 11 hanno una formulazione equivalente, ad eccezione della numerazione, vedere invece [decl.fct.default] / 5 , [temp.inst] / 1 e [temp.inst] / 3. )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.