4

C++ 標準のセクション 9.3.2.1 には、次のように記載されています。

非静的 (9.3) メンバー関数の本体では、キーワード this は、関数が呼び出されるオブジェクトのアドレスを値とする prvalue 式です。クラス X のメンバー関数での this の型は X* です。メンバー関数が const と宣言されている場合、this の型は const X* であり、メンバー関数が volatile と宣言されている場合、this の型は volatile X* であり、メンバー関数が const volatile と宣言されている場合、this の型は const です。揮発性 X*.

thisが prvalue の場合、 の値カテゴリは*this何ですか? *this以下は、オブジェクトが右辺値であっても、常に左辺値であることを示唆しています。これは正しいです?可能であれば、標準を参照してください。

struct F;
struct test
{
    void operator()(F &&) { std::cout << "rvalue operator()" << std::endl; }
    void operator()(F const &&) { std::cout << "const rvalue operator()" << std::endl; }
    void operator()(F &) { std::cout << "lvalue operator()" << std::endl; }
    void operator()(F const &) { std::cout << "const lvalue operator()" << std::endl; }
};

struct F
{
    void operator ()()
    {
        struct test t;
        t(*this);
    }
};

int main()
{
    struct F f;
    f();
    std::move(f)();
}

出力:

lvalue operator()
lvalue operator()
4

1 に答える 1

5

[basic.lval] から:

左辺値 (左辺値は代入式の左側に現れる可能性があるため、歴史的にそう呼ばれています) は、関数またはオブジェクトを指定します。[ 例:Eがポインタ型の式である 場合、 then*Eは、ポイントするオブジェクトまたは関数を参照する左辺値式Eです。別の例として、戻り値の型が左辺値参照である関数を呼び出した結果は、左辺値です。—終わりの例]

そして [expr.unary.op] から:

単項演算*子は間接参照を実行します。適用される式は、オブジェクト型へのポインター、または関数型へのポインターであり、結果は、式が指すオブジェクトまたは関数を参照する左辺値になります。

ポインターの逆参照は左辺値です。左辺*this値も同様です。

あるいは、左辺値でないものはすべて右辺値です。右辺値は次のとおりです。

右辺値 (右辺値は代入式の右側に現れる可能性があるため、歴史的にそう呼ばれています) は、xvalue、一時オブジェクト (12.2) またはそのサブオブジェクト、またはオブジェクトに関連付けられていない値です。

そして*this、間違いなくそれらのどれでもありません。

于 2015-07-11T22:05:15.090 に答える