私が理解する限り、2つの兆候の間に違いはありません。
識別子_Z
は、標準で技術的に予約されているという問題があります。主な違いは、スペースがあることである:スペースを削除
double operator""/*space*/_Z(long double);
double operator""_Z(long double);
は、基本的には、理論的には、エラー(または可能性が高い警告を)抑えるだろう回避策です。
あなたがそれらをどのように使用するかについては、あなたがリストしたリンクの例を見ましたか?
#include <iostream>
// used as conversion
constexpr long double operator"" _deg (long double deg)
{
return deg*3.141592/180;
}
// used with custom type
struct mytype
{
mytype (unsigned long long m):m(m){}
unsigned long long m;
};
mytype operator"" _mytype (unsigned long long n)
{
return mytype(n);
}
// used for side-effects
void operator"" _print (const char* str)
{
std::cout << str;
}
int main(){
double x = 90.0_deg;
std::cout << std::fixed << x << '\n';
mytype y = 123_mytype;
std::cout << y.m << '\n';
0x123ABC_print;
}
ユーザ定義リテラルの背後にある考え方は、別の型にリテラルに内蔵された変換することができるタイプに内蔵されたにも適用することができるオペレータの作成を可能にすることです。
EDIT:
あなただけのリテラル値の末尾にオペレータを追加する必要があり、これらの演算子のいずれかを呼び出します。だから、与えられた:
// used as conversion
constexpr long double operator"" _deg (long double deg)
{
return deg*3.141592/180;
}
呼び出し元のコードは、例えば次のようになります。限りtemplate <char...> double operator "" _π();
を使用すると、たぶんthis.
なぜ '_π'リテラルで何か"_π'が '演算子"を呼び出さない理由を知っていますか? "_π"、 "o"、 "m"、 "e"、 "t" 'h'、 'i'、 'n'、 'g'>() '?どのようにそれらの文字をテンプレート引数として渡すように、そのユーザー定義リテラルの宣言を変更することができますか? – Curious
@Curious個々の文字をテンプレート引数として渡すことは、数値リテラルでのみ可能です。 – hvd
それはなぜそう思う?私はなぜ文字がサポートされないのか理解できません。 – Curious