0

次のように、一時オブジェクトを const 参照によって関数に渡すことができることがわかっています。

class A
{
public:
    A(int _b = 0) 
    {
        b = _b;
    }

    int b;
};

void foo(A& a) {printf("%d", a.b);}
void cfoo(const A& a) {printf("%d", a.b);}

int main(void)
{
    //foo(A(4)); doesn't compile
    cfoo(A(5));
}

しかし、ポインターによる受け渡しはどうですか?なぜこれがコンパイルされるのですか?

void pfoo(A* pa) {pa->b = 19;}

int main(void)
{
    pfoo(&A(5));
}
4

1 に答える 1

4

しかし、無名変数ポインタを渡すのはどうですか? なぜこれがコンパイルされるのですか?

C++ 標準を尊重しないコンパイラを使用している可能性があります。

右辺値 (一時) オブジェクトのアドレスは取得できません。それはコンパイルされるべきではありません。


ただし、operator&一時オブジェクトで呼び出すことができるように、オーバーロードすることができます。

struct A
{
    A* operator&() { return this; }
};

C++11 では、一時オブジェクトを右辺値参照にバインドできます。その後、右辺値参照は左辺値のように動作するため、一時オブジェクトのアドレスを取得できます。

struct A {};

void foo(A*);

void foo(A&& a) { foo(&a); }

int main() {
    foo(A{});
}
于 2014-09-18T08:50:57.060 に答える