何か不足しているかどうかは分かりませんが、何も返すことのできないユーザー定義関数を呼び出すユーザー定義リテラルも一種のリテラルです。ではないことリテラル5_a
を(プルーフGCCとクランの両方で文字列以外のリテラルはprvaluesですか?
#include <iostream>
#include <typeinfo>
int& operator""_a(unsigned long long c);
int main()
{
std::cout << std::is_same<decltype(5_a), int&>::value;
}
印刷物1、:
標準は、文字列リテラル、butでない限りリテラルは、常にprvalueであることを述べています)文字列リテラルではなく、右辺の左辺値として扱われている:
[expr.prim.literal]/1リテラルは、一次式です。そのタイプはその形式に依存します。文字列リテラルは左辺値です。他のすべてのリテラルはprvaluesです。
とユーザ定義リテラルはliterals tooあります。
私には何が欠けていますか?
[この値カテゴリリファレンス](http://en.cppreference.com/w/cpp/language/value_category)によると、lvaluesには "関数呼び出しまたはオーバーロードされた演算子式で、戻り値の型はlvalue参照です"が含まれます。ユーザ定義リテラルが実際に何をしているかは、オーバーロードされた演算子です(あなたの例では、 '5_a'は呼び出し'演算子 "_a(5)'と同じです)。また、演算子関数は左辺値の参照を返します。これは、同じ型の左辺値の参照と比較されます。 –
@Someprogrammerdudeでも、リテラルです。それは、* italics *で書かれており、*リテラル*構文規則の下ですべてのコンストラクタを参照することを強調するために、標準には矛盾を含めることはできません。 –
@ Peregring-lk標準は人間によって書かれた文書です。矛盾を含んではいけないということは何を意味していますか? *標準化の定義を使用してはいけませんが、おそらくそれはおそらくやりますが、これはその一つかもしれません。 –