2017-10-02 8 views
3

何か不足しているかどうかは分かりませんが、何も返すことのできないユーザー定義関数を呼び出すユーザー定義リテラルも一種のリテラルです。ではないことリテラル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あります。

私には何が欠けていますか?

+0

[この値カテゴリリファレンス](http://en.cppreference.com/w/cpp/language/value_category)によると、lvaluesには "関数呼び出しまたはオーバーロードされた演算子式で、戻り値の型はlvalue参照です"が含まれます。ユーザ定義リテラルが実際に何をしているかは、オーバーロードされた演算子です(あなたの例では、 '5_a'は呼び出し'演算子 "_a(5)'と同じです)。また、演算子関数は左辺値の参照を返します。これは、同じ型の左辺値の参照と比較されます。 –

+0

@Someprogrammerdudeでも、リテラルです。それは、* italics *で書かれており、*リテラル*構文規則の下ですべてのコンストラクタを参照することを強調するために、標準には矛盾を含めることはできません。 –

+5

@ Peregring-lk標準は人間によって書かれた文書です。矛盾を含んではいけないということは何を意味していますか? *標準化の定義を使用してはいけませんが、おそらくそれはおそらくやりますが、これはその一つかもしれません。 –

答えて

4

はい、これは標準のマイナーな文言上の欠陥です。あなたは、その文(ほぼ)変わらずにバックN1905内のすべての方法を見つけることができます。

リテラルが一次式です。その種類はその形式(2.13)に依存します。文字列リテラルは左辺値です。他のすべてのリテラルは右辺値です。

この規格は、数年(N2765は、2008年半ばからである)により、ユーザ定義リテラルに先行し、この特定の文言は、「他のすべてのリテラルは[P]右辺値である」という一部のshouldnを反映するように変更されませんでしたユーザー定義のリテラルを含めることはできません。

しかし、ユーザ定義リテラルは単にfunction callの構文砂糖であるため、その値カテゴリも関数呼び出しから派生する必要があることは明らかです。それが言語機能のポイントです。あなたの例の値カテゴリ5_aは、価値がなく価値がない(すべてのコンパイラが同意する)という混乱はないので、この言葉の欠陥報告は、もしあれば、かなり低い優先順位になります。

関連する問題