2015-06-19 11 views
8

Gibt es einen Unterschied zwischen der Definition des Tag-Typs als anonyme leere Struktur oder als leere Struktur?Leere Struktur oder anonyme Struktur als Tag

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

In meinem Kopf ist der einzige Unterschied ist der „effektive“ Typname, wenn man eine Art Reflexion nutzen (das heißt __PRETTY_FUNCTION__, <cxxabi.h>:abi::__cxa_demangle(typeid().name()) usw.).

ADL Arbeit für beiden Möglichkeiten:

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

Nun, 'using' ist so ziemlich' typedef', was auf 'typedef struct' von C zurückgeht. Ich verstehe nicht, warum diese sich irgendwie unterscheiden sollten. –

+0

Sie können keine speziellen Memberfunktionen für eine anonyme Struktur schreiben. – 0x499602D2

Antwort

5

Neben den verschiedenen Saiten haben Sie bereits erwähnt, ist der einzige wesentliche Unterschied besteht darin, dass Sie B mit einem erarbeitet-Typ-Spezifizierer finden können, so Sie können anstelle von B b; sagen, aber Sie können struct A a; nicht verwenden, weil A ein typedef-name ist kein Klassenname.

Allerdings gibt es fast nie einen guten Grund zu sagen struct B statt nur B so in der Praxis ist der Unterschied nicht wichtig, vor allem nicht für Tag-Typen.

+1

Über das einzige Mal, dass ich das Wort "struct" vorstellen musste, ist für die Linux * stat() -Aufrufe, die einen Zeiger auf struct stat als einen ihrer Parameter nehmen. – Nevin

+0

@Nevin, ja, ich auch. Dieser Namenskonflikt war bei der Implementierung des Dateisystem-TS häufig ärgerlich: - \ –

Verwandte Themen