4
class MyClass {
    public: MyClass(int a) : a(a) { }
    int a;
};

#include <iostream>
void print(MyClass* a) { std::cout << a->a << std::endl; }

int main() {
    print(&static_cast<MyClass&&>(MyClass(1337)));
    return 0;
}

これは、以前のバージョンでは機能していましたが、GCC 4.6 では機能しません。

今それは言う: xvalue (rvalue 参照) のアドレスを取得します。

右辺値のアドレスを別の関数に安全に渡す方法はありますか?

4

3 に答える 3

4

is: 右辺値参照 (別名一時アドレス) を別の関数に安全に渡す方法はありますか?

はい、次の例のように、あります:

#include <iostream>

class MyClass {
       public: MyClass(int a) : a(a) { }
       int a;
   };


void print(MyClass&& a) { std::cout << a.a << std::endl; }

int main() {
    print( MyClass(1337) );
}
于 2012-03-20T11:56:49.387 に答える
2

右辺値は必ずしもアドレスを持っているとは限りません。ただし、右辺値を参照にバインドすると、それが一時的なもの(アドレスを持っている)になるという事実を利用して、必要な効果を得る方法があります。

template<typename T> T *addressOfTemporary(T &&v) { return &v; }

この関数の中にvは左辺値があり(として宣言されているにもかかわらずT&&)、そのアドレスを取得することができます。この関数は次のように使用できます。

class MyClass {
    public: MyClass(int a) : a(a) { }
    int a;
};

#include <iostream>
void print(MyClass* a) { std::cout << a->a << std::endl; }

int main() {
    print(addressOfTemporary(MyClass(1337)));
    return 0;
}

一時的なものの存続期間は完全な式(この場合は式)の終わりで終了するprint(...)ため、そのポイントを超えてポインターが使用されないように注意する必要があることに注意してください。

于 2012-03-23T06:01:41.197 に答える
1

特に右辺値のみを出力する必要がない場合は、代わりに標準のconst参照を使用できます。

class MyClass {
     public: MyClass(int a) : a(a) { }
     int a; 
};  

#include <iostream> 

void print(const MyClass& a) 
{ std::cout << a.a << std::endl; }  

int main() {
     print(MyClass(1337));
     return 0;
} 
于 2012-03-20T12:29:46.270 に答える