Questo sembra essere un bug con MSVC. Usando un'espressione del modulo T()
(che è una conversione di tipo esplicita, per quanto riguarda lo standard) si ottiene un valore del tipo specificato.
L'espressione T()
, dove T
è un semplice-type-specificatore o typename-specificatore per un non-array tipo di oggetto completa o la (possibilmente cv-qualificato) void
tipo, crea un prvalue di tipo specificato, che è di valore inizializzato
è solo con tipi non-classe che il const
vengono ignorati, a causa di una regola che prvalues non-classe non può avere cv-qualificato tipi:
I valori di classe possono avere tipi qualificati per CV; i valori prerequisiti non di classe hanno sempre tipi cv-non qualificati.
Così l'oggetto temporaneo creato da T()
qui dovrebbe essere const
e dovrebbe quindi chiamare la funzione const
membro.
Per quanto riguarda quando e perché si utilizza std::add_const
, possiamo dare un'occhiata al motivo per cui è stato incluso in the proposal. Si afferma che i caratteri di tipo , add_cv
, add_pointer
e add_reference
sono stati rimossi dalla proposta ma successivamente ripristinati dopo i reclami degli utenti di Boost.
La logica è che questi modelli sono tutti utilizzati come funtori del tempo di compilazione che trasformano un tipo in un altro [...]
L'esempio dato è:
// transforms 'tuple<T1,T2,..,Tn>'
// to 'tuple<T1 const&,T2 const&,..,Tn const&>'
template< typename Tuple >
struct tuple_of_refs
{
// transform tuple element types
typedef typename mpl::transform<
typename Tuple::elements,
add_reference< add_const<_1> > // here!
>::type refs;
typedef typename tuple_from_sequence<refs>::type type;
};
template< typename Tuple >
typename tuple_of_refs<Tuple>::type
tuple_ref(Tuple const& t)
{
return typename tuple_of_refs<Tuple>::type(t);
}
si può pensare mpl::transform
come prendere la metaprogrammazione equivalente a tempo di compilazione per un puntatore a funzione come secondo argomento template - add_reference<add_const<...>>
viene applicata a ciascuna delle tipologie in Tuple::elements
. Questo semplicemente non può essere espresso usando const
.
molto probabilmente un bug, funziona come previsto in gcc ... – Nim