2014-08-22 3 views
8

Рассмотрим эти два:Какова область действия определяемого пользователем литерала?

namespace X1 
{ 
    A operator "" _x(unsigned long long i) { return A{i}; } 
}; 

namespace X2 
{ 
    B operator "" _x(unsigned long long i) { return B{i}; } 
}; 

x буквальным определяется дважды, но один из них определяется в namespace X1, а другой определяется в namespace X2.

В соответствии со стандартом C++, может ли этот код быть скомпилирован?

+1

Вы попробовали? – erenon

+0

Нет, я не мог этого сделать в Visual C++, пока это не поддерживает. –

+3

Я рекомендую использовать http://ideone.com/, http://coliru.stacked-crooked.com/ или что-то эквивалентное онлайн-компилятору. – erenon

ответ

12

определенного пользователь буквальным трактуются как призыв к operator ""X(...) где X является идентификатором (например, _x) и ... зависит от формы определенного пользователя буквальным. Поиск соответствующего пользовательского литерального оператора затем выполняется в соответствии с обычными правилами для неквалифицированного поиска; [lex.ext]:

2 - это определенного пользователь-буквальный трактуются как призыв к буквальным оператору или буквальному шаблону оператора (13.5.8). Для того, чтобы определить форму этого вызова для данного определенного пользователя-буквальный L с удами-суффикс X, то буквального-оператором-идентификатор которого буквальным суффикс идентификатор X ищутся в контексте L, используя правила для поиска неквалифицированного имени (3.4.1). [...]

Определения _x буквального только конфликт, если оба определения сделаны для неквалифицированного поиска по using или using namespace декларации или путем ввода либо пространства имен; конфликт является лишь проблематичным, если на самом деле делается вызов безоговорочному оператору.

{ using namespace X1; auto o = 5_x; }   // OK; o is of type A 
{ using namespace X2; auto o = 5_x; }   // OK; o is of type B 
{ using namespace X1; using namespace X2; } // OK; operator "" _x is not used 
{ using namespace X1; using namespace X2; auto o = 5_x; } // ambiguous 

Было бы также ОК, если _x разные типы пользовательских литералов операторов например если один был оператором целых чисел, а другой - оператором с плавающей буквой.

+0

Я просто хотел бы добавить, что соответствующее использование 'use' будет« использовать X1 :: operator »« _x; »и« using X2 :: operator »« _x; »в случае, если кто-нибудь найдет этот вопрос и задается вопросом. – Zorawar

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