2015-06-19 3 views
8

Есть ли разница в использовании между определением типа тега как анонимной пустой структуры или пустой структурой?Пустая структура или анонимная структура как тег

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

На мой взгляд, единственное различие является «эффективным» имя типа, когда один использует своего рода отражения (т.е. __PRETTY_FUNCTION__, <cxxabi.h>:abi::__cxa_demangle(typeid().name()) и т.д.).

ADL работа для обоих способов:

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

Ну, 'использование' в значительной степени' typedef', которое возвращается к 'typedef struct' C. Я не понимаю, почему они должны отличаться. –

+0

Вы не можете писать какие-либо специальные функции-члены для анонимной структуры. – 0x499602D2

ответ

5

Помимо различных строк вы уже отмечалось, единственным существенным отличием является то, что вы можете обратиться к B используя разработанную-типа-спецификатор, так вы можете сказать struct B b; вместо B b;, но вы не можете использовать struct A a;, потому что A является typedef-name, а не классом.

Однако почти нет веской причины говорить struct B вместо B, поэтому на практике разница не важна, особенно для типов тегов.

+1

Единственный раз, когда мне нужно было предисловие, слово «struct» предназначено для вызовов Linux * stat(), которые принимают указатель на struct stat как один из их параметров. – Nevin

+0

@ Невин, да, я тоже. Это столкновение имен часто вызывало раздражение при реализации файловой системы TS: - \ –

Смежные вопросы