Se non ti dispiace lavorare su Foo b = nullptr;
, è piuttosto semplice effettuare l'hacking. Avere un costruttore esplicito da int
e un implicito da std::nullptr_t
.
Se pensi che funzioni, non sono sicuro che sia possibile. L'unico modo per distinguere tra un valore letterale di 0
e altri valori letterali interi è la conversione implicita del primo in puntatori e nullptr_t
. Pertanto, nullptr
preferirà un parametro nullptr_t
a un parametro puntatore, pertanto, avendo entrambi i costruttori, è possibile filtrare gli argomenti nullptr
. Tuttavia, le conversioni di 0
per i puntatori e nullptr_t
sono dello stesso valore, quindi questo ucciderebbe gli argomenti 0
con un'ambiguità.
Hmm ... qualcosa come questo può funzionare:
class Foo {
struct dummy;
public:
explicit Foo(int); // the version that allows Foo x(1);
Foo(dummy*); // the version that allows Foo x = 0;
template <typename T,
typename = typename std::enable_if<
std::is_same<T, std::nullptr_t>::value>::type>
Foo(T) = delete; // the version that prevents Foo x = nullptr;
};
Non ho effettivamente provato questo. In teoria, il modello dovrebbe partecipare solo alla risoluzione di sovraccarico quando l'argomento è nullptr
, perché altrimenti FINEE lo uccide. In tal caso, tuttavia, dovrebbe essere migliore del costruttore di puntatori.
fonte
2013-06-20 15:36:51
Che dire di 'Foo e (1);'? Come è valido? –
@LuchianGrigore: Sono semanticamente identici? Se è così, immagino di poterlo dichiarare invalido. – Eric
Forse puoi provare con un costruttore prendendo un 'std :: nullptr_t' (solo un'idea ...) –