2013-05-16 36 views
22

göz önünde bulundurun:C++ 11 operatörü ""

:

struct str {}; 

str operator"" _X(long double d) { 
    return str(); 
} 

Bu 4.7.2 Duvar std = C++ 11

ama şimdi bir çift elde halinde ++ g iyi derler

str operator"" _X(double d) { 
    return str(); 
} 

aşağıdaki hata iletisi alıyorum: main.cpp | 3 | hatası: 'str operatörü "" _X (çift)' geçersiz argüman listesi vardır

Sorun nedir? “Yerleşik bir edebi sonekin anlamını yeniden tanımlamak mümkün değil” (Stroustrup SSS) ile bir ilgisi var mı? Bir geçici çözüm düşünebilir misiniz?

cevap

31

What is the problem?

sorun Standart bunu yasaklar olmasıdır. Kullanıcı tanımlı değişmezleri C++ 11 Standardının paragrafında 13.5.8./3 başına: Aşağıdaki çalışıyor beri Geçici bir çözüm ile ilgili

The declaration of a literal operator shall have a parameter-declaration-clause equivalent to one of the following:

const char* 
unsigned long long int 
long double 
char 
wchar_t 
char16_t 
char32_t 
const char*, std::size_t 
const wchar_t*, std::size_t 
const char16_t*, std::size_t 
const char32_t*, std::size_t 

, ben (bir double örtük alır gerektiğinde emin değilim

struct str {}; 

str operator"" _X(long double d) { 
    return str(); 
} 

int main() 
{ 
    str s = 4.0_X; 
} 
+3

Tamam teşekkür yazabilirsiniz

str operator"" l_X(long double ld); str operator"" _X(long double d); str operator"" f_X(long double f); 

şimdi beri:

Ne yararlı olabilecek bu kümesidir. Ama neden ? Yani, sözdiziminde iki katını engelleyebilecek bir şey var mıydı? –

+5

@ BérengerBerthoul: Neden uzun çifte fazla veya daha fazla aralık ve hassasiyete sahip olduğunda çifte'yi kullanmalısınız? Muhtemelen hız veya hafıza kullanım nedenleri için doğru mu? Eh, bunlar derleme zamanında yapılan işlemler için dikkate alınmaz. Çift duyarlıklı işlemleri gerçekleştirmek istiyorsanız, her zaman işlev içinde bir döküm kullanabilirsiniz. –

+0

@Ben Voigt Tamam, benim için iyi. Sadece birazcık bir klug olduğunu düşünüyorum, ama gerçekten de büyük bir pb yok. Teşekkürler –

3

Ben şüpheli aşırı yüklemeyi önlemek için olduğunu düşünüyorum: Eğer tip double hazır bilgileri) 'de geçebilir, böylece bir long double dönüştürülür. Aşağıdaki aşırı tanımlamak için izin verildi ne Yukarıdakilerin her karşılık gelecek kaynak kodunda kullanıcı tanımlı değişmezleri örnekleri verebilir

str operator"" _X(long double ld); 
str operator"" _X(double d); 
str operator"" _X(float f); 

kurdu? Hayır, söz konusu kelimeyi belirli bir kayan nokta veri türüne sınırlamanın bir yolu yoktur. Eğer

3.0_X // treated like a double 
3.0l_X // treated like a long double 
3.0f_X // treated like a float 
+0

öyle düşünüyorum. Avantajlar elde edebilmek için C++ felsefesine ayak basacak şekilde çekim yapacaktır. Ve gerçekten de bunun faydaları olacaktı. Örneğin, gerçek kodumda "str" ​​yapısı şablondur ve özellikle "double" için başlatılır. Ve bunun için "uzun çifte" hünerlerini kullanamıyorum (uzmanlık hariç olmak üzere, ama bu gerçekten klüdji ve ör.fonksiyonlar için kısmi uzmanlığa izin verilmiyor ...) –

+1

@ BérengerBerthoul: Operatörünüzü "str operatörü" "_ _ _ (uzun double ld) {çift d = ld;/* d * /} kullanın –