2016-09-30 14 views
5

Po raz kolejny, odpowiadając na inne pytanie, zapomniałem (z mojej winy), że literalne szablony operatorów są pobierane z zestawu deklaracji tylko wtedy, gdy znaleziono liczby całkowite lub pływające.Dosłowny szablon operatora: dlaczego nie ciąg?

Jako przykład:

template <char... C> 
constexpr int operator "" _x() { 
    return 0; 
} 

Może być używany jako 10_x, ale to nie może być używany ani jako foo_x ani jako „foo” _x.

Apart z oczywistego powodu, że jest because the standard says that, jaka jest przyczyna techniczna (jeśli w ogóle), dla których nie są one brane pod uwagę przy kontaktach z napisowych?

Znalazłem także dla tego proposal (no, nie do końca to samo, ale daje pomysł), ale nadal to nie jest opcja.
Co uniemożliwia ich użycie w strunach?

+0

Czy chodziło Ci o '" foo "_x'? –

+0

@SebastianRedl Prawo, dzięki. – skypjack

+2

Dla tego, co jest warte, 'foo_x' jest identyfikatorem, więc nigdy nie wywoływałoby UDL. – Barry

Odpowiedz

6

Tam, gdzie występują komplikacje związane z zestawami znaków i kodowaniem oraz inne tego typu bałagany. Co się dzieje, jeśli kodowanie zestawu znaków różni się w czasie wykonywania i czasu kompilacji, co się dzieje, gdy istnieje wiele sposobów kodowania tego samego znaku, czy łańcuch jest zakodowany utf-8, a inne kodowanie nic nie robi? Czy tłumaczysz na zestaw znaków runtime, czy nie?

Może są łatwe odpowiedzi; ale było wystarczająco dużo komplikacji, że wnioskodawcy poszli "ok, zrobimy to" i literały weszły do ​​normy.

Znaki dozwolone dla zmiennoprzecinkowych i integralnych literałów, gdy są ograniczone i nie miały tego problemu.

Ale połączony z dokumentu związanego N2750, a które bezpośrednio stwierdził:

może istnieć zapotrzebowanie na „surowej” postaci napisu dosłownym, w którym

"Hello, " L"Worl\u0044!" 

jest odróżnialne od

ale to źle wpłynęło na fazy tłumaczenia, a nie są znane przekonujące przypadki użycia tej funkcji.