7

左辺値が右辺値参照にどのようにバインドされるかを理解しようとしています。次のコードを検討してください。

#include <iostream>

template<typename T>
void f(T&& x) {
    std::cout << x;
}

void g(int&& x) {
    std::cout << x;
}

int main() {
    int x = 4;
    f(x);
    g(x);
    return 0;
}

f() の呼び出しは問題ありませんが、g() の呼び出しはコンパイル時エラーを引き起こします。この種のバインディングはテンプレートに対してのみ機能しますか? なんで?テンプレートなしでどうにかしてそれを行うことはできますか?

4

2 に答える 2

1

0x499602D2 はすでにあなたの質問に回答しています。ただし、コードを次のように変更すると、さらに洞察が得られる場合があります。

推定された型を確認するために to をstatic_assert追加しました:f

#include <type_traits>

template<typename T>
void f(T&& x) {
    static_assert(std::is_same<T&&, int&>::value,"");
    std::cout << x;
}

assert は失敗しないxので、 inの型fは 最終的にint&(この特定の例では) になります。

gの呼び出し方法を変更しましたmain:

g(std::move(x));

これで、コードがコンパイルされ、プログラムが期待どおりに動作し、出力されます44

これが右辺値参照の理解に少し役立つことを願っています。

于 2013-06-15T19:31:49.817 に答える