2015-06-19 31 views
8

C'è qualche differenza in un uso tra la definizione del tipo di tag come una struttura vuota anonima o una struttura vuota?Struttura vuota o struttura anonima come tag

using A = struct {}; 
struct B {}; 

Alla mia mente l'unica differenza è la "efficace" nome del tipo, quando si utilizzano una sorta di riflessione (cioè __PRETTY_FUNCTION__, <cxxabi.h>:abi::__cxa_demangle(typeid().name()) ecc).

lavoro ADL per entrambi i modi:

namespace ns 
{ 

using A = struct {}; 
struct B {}; 

constexpr 
bool 
adl(A) 
{ 
    return true; 
} 

constexpr 
bool 
adl(B) 
{ 
    return true; 
} 

} 

template< typename type > 
constexpr 
bool 
adl(type) 
{ 
    return false; 
} 

static_assert(adl(ns::A{})); 
static_assert(adl(ns::B{})); 
+0

Bene, 'using' è praticamente' typedef', che risale alla 'typedef struct' di C.' Non vedo perché questi dovrebbero differire in alcun modo. –

+0

Non è possibile scrivere funzioni membro speciali per una struttura anonima. – 0x499602D2

risposta

5

A parte le diverse stringhe che avete già notato, l'unica differenza significativa è che si può fare riferimento a B utilizzando un elaborato di tipo-specifier, così puoi dire struct B b; invece di B b; ma non puoi usare struct A a; perché A è un typedef-name e non un nome di classe.

Tuttavia non c'è quasi mai una buona ragione per dire struct B invece di solo B quindi in pratica la differenza non è importante, soprattutto non per i tipi di tag.

+1

Circa l'unica volta che ho avuto bisogno di prefigurare la parola "struct" è per le chiamate Linux * stat(), che prendono un puntatore per struct stat come uno dei loro parametri. – Nevin

+0

@Nevin, sì, anche io. Quel nome-scontro era spesso fastidioso durante l'implementazione del Filesystem TS: - \ –